本文實例講述了javascript異步處理與Jquery deferred對象用法。分享給大家供大家參考,具體如下:
這是項目組老大整理的一些關于jquery 異步處理請求,以及使用 jquery deferred 對象的一些常見方法。雖然是項目上總結出來的。但也比較通用,分享在這里。
所有的Ajax操作都采用異步處理。 采用Jquery的Deffered對象來處理異步調用。 因為是異步調用,所以$.Ajax函數的返回值不代表返回的結果,只是一個Deffered對象。 Ajax調用完成后執行的邏輯可以寫成函數作為參數傳遞給Deffered對象的done(), fail(), always()函數來執行。 如果一個函數包含Ajax調用,那么這個函數必須將Ajax返回的異步對象作為自己的返回值,否則函數的調用者無法保證后續代碼的正常執行順序。例如:
function readData(){ $.ajax({ url:"test", dataType:"json" }) .done(function() { //.... });}readData();//...這里想添加一些后續處理,但程序將在Ajax回調前執行,所以無法達到預期目的正確的代碼:function readData(){ return $.ajax({ url:"test", dataType:"json" }) .done(function() { //.... });}readData().done(function () { //...想添加的后續處理可以加在這里處理}); 如果需要調用多個Ajax請求,請注意Ajax請求是否可以同時進行,如果可以應該使用when()函數來同時執行,以提高程序的運行效率和可讀性。 deferred對象有一個方法promise(),可以阻止其他代碼修改deferred對象的狀態,也就是其他代碼調用reslove()和reject()無效。var dtd = $.Deferred(); // 新建一個Deferred對象var wait = function(dtd){ var tasks = function(){ alert("執行完畢!"); dtd.resolve(); // 改變Deferred對象的執行狀態 }; setTimeout(tasks,5000); return dtd;};wait(dtd).done(function(){ alert("成功了!"); }).fail(function(){ alert("出錯啦!"); });dtd.resolve(); //這里修改了dtd對象的狀態,導致立刻出現“成功了!”的提示正確的例子:
var dtd = $.Deferred(); // 新建一個Deferred對象var wait = function(dtd){ var tasks = function(){ alert("執行完畢!"); dtd.resolve(); // 改變Deferred對象的執行狀態 }; setTimeout(tasks,5000); return dtd.promise(); // 返回promise對象};wait(dtd).done(function(){ alert("成功了!"); }).fail(function(){ alert("出錯啦!"); });dtd.resolve(); //這里修改dtd對象的狀態無效 一些情況的處理:1.嵌套異步操作的處理。
如果一個函數內部執行異步任務,并且在異步任務的done回調內會嵌套另一個異步任務,那么簡單返回第一個異步任務的返回值是不行的,需要另外自行定義一個Deferred對象作為返回值。
新聞熱點
疑難解答
圖片精選