2012-06-14 32 views
3

我需要進行一系列(1-20)ajax調用,並且我需要在全部完成時調用另一個函數。完成後,我的意思是$ .ajax({complete:...})被調用。當一系列jquery ajax調用完成時執行一個函數(!)

Iv使用$ .when查看,但在jsfiddle上擺弄它之後,我有兩個問題。 1. $ .then和$ .done在所有完整的回調之前被調用。 2.如果一個ajax調用失敗,它根本不會被調用。 基本上,它看起來$ .done被稱爲成功,並沒有完成。

我認爲必須有一些好的ajax經理/隊列thingy可以處理這種東西。或者,也許甚至是一些通用異步任務hanlding啄..;)

小提琴:http://jsfiddle.net/zvSgX/2

+0

你不會在jQuery中找到延遲管理器... – Bergi

+0

你看看這裏: http://lostechies.com/joshuaflanagan/2011/10/20/coordinating-multiple-ajax-requests-with -jquery-when/ –

+0

@ eric.itzhak不是專門發佈,但是。並在該帖子的例子中,如果一個getTweets失敗,整個事情將失敗。 – MatteS

回答

2

如果你不喜歡當$.ajax 電話解決他們推遲對象的默認jQuery的選擇,你可以寫你自己的包裝;

var my_ajax = function (options) { 

    var deferred = $.Deferred(); 
    var user_complete = options.complete; 

    options.complete = function (jqXHR, textStatus) { 
     if (user_complete) user_complete(jqXHR, textStatus); 
     deferred.resolve(); 
    }; 

    $.ajax(options); 

    return deferred.promise(); 
}; 

這裏是一個fork of your JSFiddle與您 示例代碼演示它的行動。

由於my_ajax不調用過deferred.reject(),鏈接一個.fail$.when 將是毫無意義的,如果所有的參數都$.when來電my_ajax

希望有幫助!請讓我知道我是否可以澄清任何事情。

+0

謝謝你!我想我知道了:http://jsfiddle.net/zvSgX/10/ – MatteS

+0

酷!很高興幫助。 – goggin13

0

我最近使用的解決方案工作不壞海事組織。通過一個for循環,我調用了一個方法,該方法依次執行一個window.setTimeout函數,該函數使用正確的數據執行ajax調用。我使用了一個max和counter變量來檢查是否所有的ajax調用都是正確執行的(在成功函數結束時遞增計數器)。如果計數器等於最大值,則檢查另一個setTimeout調用的函數。如果不是,則在新的setTimeout中再次調用該方法,否則調用最後必須執行的函數。

代碼

所以:

var count = 0, max = 0; 

function batchCall() { 
var a = [{ 
    method: "DoThis", 
    params: { param1: 1, param2: 2 } 
}, { 
    method: "DoThat", 
    params: { param1: 3 } 
}] 

max = a.length; 

for (var i = 0; i < max; i++) { 
    callAjax(a[i]); 
} 

window.setTimeout(checkAllFinished, 100); 
} 

function callAjax(o) { 
    window.setTimeout(function() { 
     // do ajax call here 
    }, 0); 
} 

function checkAllFinished() { 
    if (count == max) { 
     // do what you need to do when all are called 
    } 
    else { 
     window.setTimeout(checkAllFinished, 100); 
    } 
} 
+0

使用setTimout的解決方案顯然不是解決方案。 – Bergi

1

可以使用承諾模式來解決這個問題 您可以使用when.js庫來解決此問題類型教程 和樣品可在以下位置

https://github.com/cujojs/when

+0

感謝您指出我的方向,但請您提供一個示例,說明這可以幫助我嗎? – MatteS

+0

嘗試過,但我有相同的問題:http:// jsfiddle。net/zvSgX/7/ – MatteS

+0

在閱讀了大量的描述並將它們包裹在這個模式之後,我想出了這個作爲使用when.js的替代方案。但事情是,它非常類似goggin13的建議,所以現在我想知道什麼是親和騙局。http://jsfiddle.net/zvSgX/8/ – MatteS

相關問題