jQuery中的deferred使用方法
deferred簡(jiǎn)介
deferred對(duì)象是jQuery的回調(diào)函數(shù)解決方案,jQuery之前的版本中異步回調(diào)這塊做的不是很好,所以后期補(bǔ)上了該解決方案。
普遍的ajax操作方式
我們先來回顧一下jQuery中普通的ajax操作
$.ajax({ url: 'test.html', success: function (res) { console.log('數(shù)據(jù)讀取成功'); }, error: function () { console.log('數(shù)據(jù)讀取失敗'); } });
1.5版本后的新寫法如下:
$.ajax('test.html').done(function (res) { console.log('數(shù)據(jù)讀取成功'); }).fail(function () { console.log('數(shù)據(jù)讀取失敗'); });
新版本的寫法相比老版本有一個(gè)優(yōu)勢(shì),就是可以自由添加多個(gè)回調(diào)函數(shù)并且按照添加順序執(zhí)行:
$.ajax('test.html').done(function (res) { console.log('數(shù)據(jù)讀取成功'); }).fail(function () { console.log('數(shù)據(jù)讀取失敗'); }).done(function (res) { console.log('這是第二個(gè)成功的回調(diào)函數(shù)'); });
為多個(gè)ajax指定回調(diào)函數(shù)
我們可以通過when方法,為多個(gè)事件指定一個(gè)回調(diào)函數(shù)
$.when($.ajax('test.html'), $.ajax('test2.html')).done(function (res) { console.log('數(shù)據(jù)讀取成功'); }).fail(function () { console.log('數(shù)據(jù)讀取失敗'); });
為普通函數(shù)指定回調(diào)函數(shù)
前面說到的when是用于ajax方法,而ajax其實(shí)是deferred對(duì)象,如果不是ajax對(duì)象,換成普通的函數(shù)呢,直接使用when是不會(huì)有效果的,會(huì)直接執(zhí)行done方法
所以我們需要手動(dòng)新建一個(gè)deferred對(duì)象
var defer = $.deferred(); //新建一個(gè)deferred對(duì)象 var wait = function (defer) { var tasks = function () { console.log('執(zhí)行完畢!'); defer.resolve(); //改變deferred對(duì)象的執(zhí)行狀態(tài) - 成功 }; setTimeout(tasks, 5000); return defer; };
這里的resolve就是觸發(fā)done的,對(duì)應(yīng)的reject方法則是用來調(diào)用fail方法的。
var defer = $.deferred(); //新建一個(gè)deferred對(duì)象 var wait = function (defer) { var tasks = function () { console.log('執(zhí)行完畢!'); defer. reject(); //改變deferred對(duì)象的執(zhí)行狀態(tài) - 失敗 }; setTimeout(tasks, 5000); return defer; };
執(zhí)行方法
$.when(wait(defer)).done(function (res) { console.log('數(shù)據(jù)讀取成功'); }).fail(function () { console.log('數(shù)據(jù)讀取失敗'); });
進(jìn)一步優(yōu)化
上面的代碼還有一些問題,defer是暴露在全局的,所以我們是可以通過在全局進(jìn)行defer.resolve()來提前回調(diào)。
為了避免這種情況,jQuery提供了deferred.promise()方法,它的作用是在原來的deferred對(duì)象上返回另一個(gè)deferred對(duì)象,后者只開放與改變執(zhí)行狀態(tài)無關(guān)的方法(比如done方法和fail方法)屏蔽與改變執(zhí)行狀態(tài)有關(guān)的方法(比如resolve和reject方法)。
var defer = $.deferred(); //新建一個(gè)deferred對(duì)象 var wait = function (defer) { var tasks = function () { console.log('執(zhí)行完畢!'); defer.resolve(); //改變deferred對(duì)象的執(zhí)行狀態(tài) - 成功 }; setTimeout(tasks, 5000); return defer.promise(); }; $.when(wait(defer)).done(function (res) { console.log('數(shù)據(jù)讀取成功'); }).fail(function () { console.log('數(shù)據(jù)讀取失敗'); });
也可以把defer包在函數(shù)中
// 普通方法 var wait = function () { var defer = $.deferred(); //新建一個(gè)deferred對(duì)象 var tasks = function () { console.log('執(zhí)行完畢!'); defer.resolve(); //改變deferred對(duì)象的執(zhí)行狀態(tài) - 成功 }; setTimeout(tasks, 5000); return defer.promise(); }; $.when(wait()).done(function (res) { console.log('數(shù)據(jù)讀取成功'); }).fail(function () { console.log('數(shù)據(jù)讀取失敗'); }); // 執(zhí)行異步 var setAjax = function () { var defer = $.Deferred(); if (xhr) { xhr.abort(); xhr = null; } var xhr = $.ajax({ url: 'test.html', success: function (res) { console.log('數(shù)據(jù)讀取成功'); defer.resolve(res); }, error: function () { console.log('數(shù)據(jù)讀取失敗'); defer.reject(); } }); return defer.promise(); } $.when(setAjax()).then(function (res) { console.log('數(shù)據(jù)讀取成功', res); }, function () { console.log('數(shù)據(jù)讀取失敗'); });
以上所述是小編給大家介紹的jQuery中的derferred使用方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
JQuery中使用.each()遍歷元素學(xué)習(xí)筆記
這篇文章主要介紹了jquery中使用.each()遍歷元素學(xué)習(xí)筆記,本文從實(shí)際項(xiàng)目經(jīng)驗(yàn)總結(jié)而來,需要的朋友可以參考下2014-11-11jquery+ajax請(qǐng)求且?guī)Х祷刂档拇a
這兩天的工作內(nèi)容不多,基本是關(guān)于jquery中ajax的。之前一直都是寫的最簡(jiǎn)單的ajax請(qǐng)求,并沒關(guān)注怎么獲取ajax返回值的問題。2015-08-08jquery 實(shí)現(xiàn)checkbox全選,反選,全不選等功能代碼(奇數(shù))
jquery 實(shí)現(xiàn)全選,反選,全不選等功能,下面直接以例子進(jìn)行說明,需要的朋友可以參考下2012-10-10jquery中插件實(shí)現(xiàn)自動(dòng)添加用戶的具體代碼
當(dāng)點(diǎn)擊添加時(shí)自動(dòng)彈出窗口,填寫完畢按確定自動(dòng)添加到table表格中,有需要的朋友可以參考一下2013-11-11jquery使用jquery.zclip插件復(fù)制對(duì)象的實(shí)例教程
這篇文章主要介紹了jquery使用jquery.zclip插件復(fù)制對(duì)象的實(shí)例教程,當(dāng)然也可以復(fù)制輸入框input、textarea等內(nèi)容,下面看代碼2013-12-12JQuery 獲得絕對(duì),相對(duì)位置的坐標(biāo)方法
獲取頁(yè)面某一元素的絕對(duì)X,Y坐標(biāo),可以用offset()方法:(body屬性設(shè)置margin :0;padding:0;)2010-02-02jQuery中使用了document和window哪些屬性和方法小結(jié)
未列出常見的比如document.getElementById(),object.addEventListener()等。2011-09-09