javascript異步處理與Jquery deferred對象用法總結
本文實例講述了javascript異步處理與Jquery deferred對象用法。分享給大家供大家參考,具體如下:
這是項目組老大整理的一些關于jquery 異步處理請求,以及使用 jquery deferred 對象的一些常見方法。雖然是項目上總結出來的。但也比較通用,分享在這里。
- 所有的Ajax操作都采用異步處理。
- 采用Jquery的Deffered對象來處理異步調用。
- 因為是異步調用,所以
$.Ajax
函數的返回值不代表返回的結果,只是一個Deffered對象。 - Ajax調用完成后執(zhí)行的邏輯可以寫成函數作為參數傳遞給Deffered對象的
done()
,fail()
,always()
函數來執(zhí)行。 - 如果一個函數包含Ajax調用,那么這個函數必須將Ajax返回的異步對象作為自己的返回值,否則函數的調用者無法保證后續(xù)代碼的正常執(zhí)行順序。
例如:
function readData(){ $.ajax({ url:"test", dataType:"json" }) .done(function() { //.... }); } readData(); //...這里想添加一些后續(xù)處理,但程序將在Ajax回調前執(zhí)行,所以無法達到預期目的 正確的代碼: function readData(){ return $.ajax({ url:"test", dataType:"json" }) .done(function() { //.... }); } readData().done(function () { //...想添加的后續(xù)處理可以加在這里處理 });
- 如果需要調用多個Ajax請求,請注意Ajax請求是否可以同時進行,如果可以應該使用
when()
函數來同時執(zhí)行,以提高程序的運行效率和可讀性。 - deferred對象有一個方法
promise()
,可以阻止其他代碼修改deferred對象的狀態(tài),也就是其他代碼調用reslove()
和reject
()無效。
var dtd = $.Deferred(); // 新建一個Deferred對象 var wait = function(dtd){ var tasks = function(){ alert("執(zhí)行完畢!"); dtd.resolve(); // 改變Deferred對象的執(zhí)行狀態(tài) }; setTimeout(tasks,5000); return dtd; }; wait(dtd) .done(function(){ alert("成功了!"); }) .fail(function(){ alert("出錯啦!"); }); dtd.resolve(); //這里修改了dtd對象的狀態(tài),導致立刻出現“成功了!”的提示
正確的例子:
var dtd = $.Deferred(); // 新建一個Deferred對象 var wait = function(dtd){ var tasks = function(){ alert("執(zhí)行完畢!"); dtd.resolve(); // 改變Deferred對象的執(zhí)行狀態(tài) }; setTimeout(tasks,5000); return dtd.promise(); // 返回promise對象 }; wait(dtd) .done(function(){ alert("成功了!"); }) .fail(function(){ alert("出錯啦!"); }); dtd.resolve(); //這里修改dtd對象的狀態(tài)無效
- 一些情況的處理:
1.嵌套異步操作的處理。
如果一個函數內部執(zhí)行異步任務,并且在異步任務的done回調內會嵌套另一個異步任務,那么簡單返回第一個異步任務的返回值是不行的,需要另外自行定義一個Deferred對象作為返回值。
function loadComponent(id){ var dtd = $.Deferred(); //loadScript將異步加載一個js文件,所以返回值是一個Deffered對象 return loadScript(id) .done(function() { //js加載后,觸發(fā)component的load事件,此事件內將使用Ajax獲取頁面模板和數據,生成最終的html app.getComponent(id).trigger("load") .done( function(){ dtd.reslove(agruments); }).fail( function(){ dtd.reject(agruments); }); }); //返回自定義的dtd對象,才能保證返回值的done回調在load事件完成后執(zhí)行 return dtd; }
2.一個函數內同時包含同步和異步case
的處理。
/* 這個函數返回一個異步對象,當異步對象執(zhí)行done時,表示component被加載完成 */ function requireComponent(id){ if (this.components[id]){ //如果component已經被加載,直接返回一個reslove的異步對象,否則返回值內容與else分支不同,后續(xù)代碼難以處理 var dtd = $.Deferred(); dtd.reslove(this.getComponent(id)); return dtd; } else{ //如果component未被加載,loadScript將異步加載JavaScript并執(zhí)行,然后將被加載的component放入this.components return loadScript(id); } }
- Jquery異步模型有一個缺點,就是缺乏類似
wait
操作的處理能力,如果多個異步調用要順序發(fā)生時,就要在done里面嵌套處理,影響代碼可讀性.
aSyncTask1.done( function () { //...第一個操作完成后的處理 asyncTask2.done( function () { //...第二個操作完成后的處理 asyncTask3.done( function () { //...第三個操作完成后的處理 }); }) })
更多關于jQuery相關內容感興趣的讀者可查看本站專題:《jQuery form操作技巧匯總》、《jQuery文件與目錄操作技巧匯總》、《jquery中Ajax用法總結》、《jQuery擴展技巧總結》、《jquery選擇器用法總結》及《jQuery常用插件及用法總結》
希望本文所述對大家jQuery程序設計有所幫助。
相關文章
輕松使用jQuery雙向select控件Bootstrap Dual Listbox
這篇文章主要教大家如何輕松使用jQuery雙向select控件Bootstrap Dual Listbox,感興趣的小伙伴們可以參考一下2015-12-12jQuery ajax 當async為false時解決同步操作失敗的問題
這篇文章主要介紹了 jQuery ajax 當async為false時解決同步操作失敗的問題的相關資料,需要的朋友可以參考下2016-11-11jquery異步調用頁面后臺方法‏(asp.net)
給出了兩個簡單的例子,無參數的和有參數的,返回的都是json數據。2011-03-03jQuery中關于ScrollableGridPlugin.js(固定表頭)插件的使用逐步解析
以前寫前臺的時候需要用哪些效果從來都是有現成的東西拿來就用的,因為自己真的是有些懶,毫無探索精神,只重視結果,不追求過程2014-07-07