在咱們前端處理數據的時候免不了要 ajax 與後臺通訊, ajax 是經過 XMLHttpRequest 對象與服務器進行通訊的, jquery 在 XMLHttpReaquest 的基礎上封裝了 $.ajax 辦法進行通訊, $.ajax 辦法實用性很是強,又很是簡單易用。 本次二次封裝 query ajax,參考 express 能夠添加中間件處理數據,返回 Promise(Defferd) 對象,減小回調, 寫 ajax 更加簡潔、優雅。javascript
$.ajax({ url: url, data: data, dataType: 'json', type: 'get', success: new Function(){}, error: new Function(){}, ....... })
大部分的時候咱們只須要傳入 url 和 data, 就能夠獲取到咱們想到的數據了。前端
可是在項目中使用 $.ajax, 它仍是有一些痛點的
就是如今基本全部項目的 ajax 返回的數據也是進行了二次封裝,加入了後臺在處理業務邏輯時的信息。java
從返回 data, 變成 了 {code: 200, data:{}, err_msg:''}jquery
若是每個 ajax 請求回來都要判斷 code 是否正確再進行業務邏輯處理或者報錯提醒, 整個項目下來也太冗餘了,ajax
$.ajax({ url: url, data: data, success: function(data){ if(data.code == 200) { dosomething() } else { alert(data.err_msg); } } })
爲了解決這個問題,咱們用一個函數再次封裝 $.ajax, 把這種正確與否判斷再處理業務邏輯或者報錯提醒提取出來作成公共的部分。express
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) } }) }
用 util.ajax 代替 $.ajax 使用就能夠減小了業務錯誤的判斷啦。 咱們再來完善下, 不使用回調的方式,使用 promise 的方式調用, 減小回調,讓代碼更清晰。json
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
引入一箇中間件來解決差別化問題。promise
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(){})