關(guān)于二次封裝jquery ajax辦法示例詳解
前言
Ajax 的全稱是Asynchronous JavaScript and XML 異步的javaScript和XML
AJax所涉及到得技術(shù):
1.使用CSS和XHTML來(lái)表示。
2. 使用DOM模型來(lái)交互和動(dòng)態(tài)顯示。
3.使用XMLHttpRequest來(lái)和服務(wù)器進(jìn)行異步通信。(核心)
4.使用javascript來(lái)綁定和調(diào)用。
在我們前端處理數(shù)據(jù)的時(shí)候免不了要 ajax 與后臺(tái)通信, ajax 是通過(guò) XMLHttpRequest 對(duì)象與服務(wù)器進(jìn)行通信的, jquery 在 XMLHttpReaquest 的基礎(chǔ)上封裝了 $.ajax
辦法進(jìn)行通信, $.ajax
辦法實(shí)用性非常強(qiáng),又非常簡(jiǎn)單易用。 本次二次封裝 query ajax,參考 express 可以添加中間件處理數(shù)據(jù),返回 Promise(Defferd) 對(duì)象,減少回調(diào), 寫 ajax 更加簡(jiǎn)潔、優(yōu)雅。
$.ajax({ url: url, data: data, dataType: 'json', type: 'get', success: new Function(){}, error: new Function(){}, ....... })
大部分的時(shí)候我們只需要傳入 url 和 data, 就可以獲取到我們想到的數(shù)據(jù)了。
痛點(diǎn)
但是在項(xiàng)目中使用 $.ajax
, 它還是有一些痛點(diǎn)的
就是現(xiàn)在基本所有項(xiàng)目的 ajax 返回的數(shù)據(jù)也是進(jìn)行了二次封裝,加入了后臺(tái)在處理業(yè)務(wù)邏輯時(shí)的信息。
從返回 data, 變成 了 {code: 200, data:{}, err_msg:''}
如果每一個(gè) ajax 請(qǐng)求回來(lái)都要判斷 code 是否正確再進(jìn)行業(yè)務(wù)邏輯處理或者報(bào)錯(cuò)提醒, 整個(gè)項(xiàng)目下來(lái)也太冗余了,
$.ajax({ url: url, data: data, success: function(data){ if(data.code == 200) { dosomething() } else { alert(data.err_msg); } } })
為了解決這個(gè)問題,我們用一個(gè)函數(shù)再次封裝 $.ajax
, 把這種正確與否判斷再處理業(yè)務(wù)邏輯或者報(bào)錯(cuò)提醒提取出來(lái)做成公共的部分。
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
使用就可以減少了業(yè)務(wù)錯(cuò)誤的判斷啦。 我們?cè)賮?lái)完善下, 不使用回調(diào)的方式,使用 promise 的方式調(diào)用, 減少回調(diào),讓代碼更清晰。
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('接口出錯(cuò),請(qǐng)重試'); }) return deferred.fail(function (err) { alert(err) }); } // 調(diào)用 var obj = { url: '/interface', data: { interface_name: 'name', interface_params: JSON.stringify({}) } }; util.ajax(obj) .done(function(data){ dosomething(data) })
中間件
這是一個(gè)公共的辦法,但是有時(shí)候我們需要處理差異化啊, 我們參考 express 引入一個(gè)中間件來(lái)解決差異化問題。
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('接口出錯(cuò),請(qǐng)重試'); }) // 添加中間件 if(!middleware) { middleware = function(){}; } return deferred.done(middleware).fail(function (err) { message({ content: err, type: 'error', showLeftIcon: true, duration: 5000 }); }); } // 調(diào)用 // 調(diào)用 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) })
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Ajax異步請(qǐng)求JSon數(shù)據(jù)(圖文詳解)
在編程過(guò)程中使用ajax調(diào)用數(shù)據(jù)的時(shí)候,難免要進(jìn)行邏輯的處理,接受的數(shù)據(jù)也變的復(fù)雜比如數(shù)組類型的數(shù)據(jù),這時(shí)候就需要使用JSON數(shù)據(jù)類型進(jìn)行處理,通過(guò)本篇文章給大家介紹Ajax異步請(qǐng)求json數(shù)據(jù),需要的朋友可以參考下本文2015-09-09表單上傳功能實(shí)現(xiàn) ajax文件異步上傳
這篇文章主要為大家詳細(xì)介紹了表單上傳功能和文件上傳功能實(shí)現(xiàn),ajax文件異步上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08django使用ajax post數(shù)據(jù)出現(xiàn)403錯(cuò)誤如何解決
在django中,使用jquery ajax post數(shù)據(jù),會(huì)出現(xiàn)403的錯(cuò)誤,該如何解決呢?下面由腳本之家小編幫大家解決django使用ajax post數(shù)據(jù)出現(xiàn)403錯(cuò)誤,需要的朋友可以參考下2015-09-09分享Ajax創(chuàng)建簡(jiǎn)單實(shí)例代碼
這篇文章主要為大家分享了Ajax創(chuàng)建簡(jiǎn)單實(shí)例代碼,學(xué)習(xí)Ajax如何創(chuàng)建簡(jiǎn)單實(shí)例,感興趣的小伙伴們可以參考一下2015-12-12利用Ajax實(shí)現(xiàn)在腳本里傳值實(shí)例介紹
Ajax實(shí)現(xiàn)在腳本里傳值可以解決實(shí)際上的一些問題,本文實(shí)現(xiàn)了一下,感興趣的朋友可以參考下,希望可以幫助到你2013-04-04Ajax校驗(yàn)是否重復(fù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Ajax校驗(yàn)是否重復(fù)的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03使用Ajax實(shí)現(xiàn)簡(jiǎn)單的帶百分比進(jìn)度條實(shí)例
最近做項(xiàng)目遇到這樣的需求要求當(dāng)進(jìn)行文件長(zhǎng)傳保存等操作時(shí),能在頁(yè)面顯示一個(gè)帶百分比的進(jìn)度條,給用戶一個(gè)好的交互體驗(yàn),下面通過(guò)實(shí)例代碼給大家介紹基于ajax實(shí)現(xiàn)帶百分比進(jìn)度條效果,需要的的朋友參考下吧2017-07-07