摘要:本次二次封裝,參考可以添加中間件處理數據,返回對象,減少回調,寫更加簡潔優雅。痛點但是在項目中使用它還是有一些痛點的就是現在基本所有項目的返回的數據也是進行了二次封裝,加入了后臺在處理業務邏輯時的信息。
前言
在我們前端處理數據的時候免不了要 ajax 與后臺通信, ajax 是通過 XMLHttpRequest 對象與服務器進行通信的, jquery 在 XMLHttpReaquest 的基礎上封裝了 $.ajax 辦法進行通信, $.ajax 辦法實用性非常強,又非常簡單易用。 本次二次封裝 query ajax,參考 express 可以添加中間件處理數據,返回 Promise(Defferd) 對象,減少回調, 寫 ajax 更加簡潔、優雅。
$.ajax({ url: url, data: data, dataType: "json", type: "get", success: new Function(){}, error: new Function(){}, ....... })
大部分的時候我們只需要傳入 url 和 data, 就可以獲取到我們想到的數據了。
痛點但是在項目中使用 $.ajax, 它還是有一些痛點的
就是現在基本所有項目的 ajax 返回的數據也是進行了二次封裝,加入了后臺在處理業務邏輯時的信息。
從返回 data, 變成 了 {code: 200, data:{}, err_msg:""}
如果每一個 ajax 請求回來都要判斷 code 是否正確再進行業務邏輯處理或者報錯提醒, 整個項目下來也太冗余了,
$.ajax({ url: url, data: data, success: function(data){ if(data.code == 200) { dosomething() } else { alert(data.err_msg); } } })
為了解決這個問題,我們用一個函數再次封裝 $.ajax, 把這種正確與否判斷再處理業務邏輯或者報錯提醒提取出來做成公共的部分。
util.ajax = function(obj, successFn){ $.ajax({ url: obj.url || "/interface", data: obj.data || {}, dataType: obj.dataType || "json", type: obj.type || "get", success: function(data){ if (data.code != 200) { alert(data.err_msg); } else { successFn(data.data) } }, error: function(err){ alert(err) } }) }promise
用 util.ajax 代替 $.ajax 使用就可以減少了業務錯誤的判斷啦。 我們再來完善下, 不使用回調的方式,使用 promise 的方式調用, 減少回調,讓代碼更清晰。
util.ajax = function(obj) { var deferred = $.Deferred(); $.ajax({ url: obj.url || "/interface", data: obj.data || {}, dataType: obj.dataType || "json", type: obj.type || "get", }).success(function (data) { if (data.code != 200) { deferred.reject(data.err_msg); } else { deferred.resolve(data.data) } }).error(function (err) { deferred.reject("接口出錯,請重試"); }) return deferred.fail(function (err) { alert(err) }); } // 調用 var obj = { url: "/interface", data: { interface_name: "name", interface_params: JSON.stringify({}) } }; util.ajax(obj) .done(function(data){ dosomething(data) })中間件
這是一個公共的辦法,但是有時候我們需要處理差異化啊, 我們參考 express 引入一個中間件來解決差異化問題。
util.ajax = function(obj, middleware) { var deferred = $.Deferred(); $.ajax({ url: obj.url || "/interface", data: obj.data || {}, dataType: obj.dataType || "json", type: obj.type || "get", }).success(function (data) { if (data.code != 200) { deferred.reject(data.err_msg); } else { deferred.resolve(data.data) } }).error(function (err) { deferred.reject("接口出錯,請重試"); }) // 添加中間件 if(!middleware) { middleware = function(){}; } return deferred.done(middleware).fail(function (err) { message({ content: err, type: "error", showLeftIcon: true, duration: 5000 }); }); } // 調用 // 調用 var obj = { url: "/interface", data: { interface_name: "name", interface_params: JSON.stringify({}) } }; var middleware = function(data) { data.forEach(function(item){ item.fullName = item.firstName + item.lastName }) } util.ajax(obj, middleware) .done(function(data){ console.log(data.fullName) }).always(function(){})
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/83822.html
vue 頭條 demo 寫在前面 總結一下寫 demo 過程中 遇到的一些問題,方便自己的學習總結!如有錯誤,還請指正! 一直想學習使用 vue ,并準備以后在實際項目使用,之前跟著慕課網 黃軼 老師 敲了一下 餓了么商品購買頁的demoele效果預覽 該 demo 借鑒自 hcy1996-github 這個項目,但內部內容,布局風格,完全不同,只為共同學習,共同交流 數據接口 直接打開 今日...
摘要:對于那些老網站或者老項目來說全盤改造成并不現實,于是就有了局部頁面刷新這個解決方案。如果不知道局部頁面刷新是何物請看這里,這里和這里。但實際上,第一次后退無法還原的內容陷阱,第二次后退頁面刷新了一切恢復最初的樣子。 ajax在現代網站已經得到非常普遍地應用,主要的好處大家都知道(異步加載數據,不用刷新整個瀏覽器,更小的數據傳輸尺寸)。對于那些老網站或者老項目來說全盤改造成ajax并不現...
摘要:回調使用封裝入門回調是啥看這里回調是什么方應杭知乎是一種特殊的函數,這個函數被作為參數傳給另一個函數去調用。 回調、使用Promise封裝ajax()、Promise入門 1 回調是啥 call a functioncall a function back callback 看這里:Callback(回調)是什么?---方應杭知乎 callback 是一種特殊的函數,這個函數被作為參數...
摘要:根據習慣簡化了。最最重要實現異步請求結果的緩存和請求的批量中斷安裝支持直接引入如下函數執行結果生成一個對象,自帶個屬性,相見文檔同時也支持或的引入方式。中斷異步請求返回一個對象,每次異步請求都以是緩存其中。 ajaxCache 根據習慣簡化了API。最最重要:實現異步請求結果的緩存和請求的批量中斷 showImg(http://oaaq2vqkp.bkt.clouddn.com/1.g...
閱讀 1791·2021-11-11 11:02
閱讀 1699·2021-09-22 15:55
閱讀 2501·2021-09-22 15:18
閱讀 3500·2019-08-29 11:26
閱讀 3758·2019-08-26 13:43
閱讀 2656·2019-08-26 13:32
閱讀 914·2019-08-26 10:55
閱讀 973·2019-08-26 10:27