2011-09-29 73 views
3

我一直在研究jQuery的推遲對象一段時間了,而我一直在困擾着一件事。jquery:當您將延遲對象傳入「then」時會發生什麼?

「完成」,「總是」,「然後」等等方法將延遲對象解析時應該調用的函數作爲它們的參數。

但是我試圖通過傳遞延遲對象進入「永遠」的方法鏈接請求,而且這似乎工作過:

// A is an array of data 
var req = ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure); 
for (var i = 1 ; i < A.length ; i++) { 
    var tmp = ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure); 
    req.always(tmp); 
    req = tmp; 
} 

但是,它並沒有真正發揮作用。因爲當我按照上面的代碼如下:

req.always(foobar); 

foobar的似乎得到所謂的一些隨機時間,之後不一定數組中的最後一個元素進行處理。

使用時會更好嗎?

// A is an array of data 
var req = $.when(ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure)); 
for (var i = 1 ; i < A.length ; i++) { 
    req = $.when(req, ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure)); 
} 
req.always(foobar); 

會上面的代碼(用「時」)結果在AJAX請求發生一前一後,還是會它們同時發生?

順便說一句,我用「管道」來看鏈接,但由於範圍問題,我認爲使用「管道」與上面的for循環會更困難。

此外,爲什麼原始代碼「幾乎工作」?那裏發生了什麼?它是否像執行函數一樣執行延遲對象,當它執行時會發生什麼?

+0

PS:我嘗試使用$。當它似乎工作。然而,我仍然不明白爲什麼要這樣做「有點」的工作。這似乎是創建請求鏈比使用管道更好的方式 - 但我不確定這是如何「何時」打算使用。 – eeeeaaii

+0

當ajax調用的結果用於構建另一個Ajax調用的輸入時,.pipe()很有用。在你的情況下,它看起來像並行ajax調用,使用$ .when()合併,更加適當。在我的回答中,我向您展示瞭如何在合併的延遲 – olivieradam666

+0

p.p.s.上使用.done()註冊單個成功回調函數。使用$ .wait實際上並不奏效。但下面的「管道」的解決方案似乎工作,但我必須解決與「我」的範圍界定問題 – eeeeaaii

回答

2

你應該建立一個數組,並使用javascript apply

//create an array of one deferred per element 
var requests = $.map(A, function(index, a){return= $.ajax(url + "?d=" + a);}); 
//merge all deferreds into a single one 
var mergedRequest = $.when.apply(null, requests); 

mergedRequest.done(function(res0, res1, ...){ 
    //your code goes here 
    //if you want results as an array just use arguments 
    arguments.length == A.length; 
}); 

編輯: 如果您想進行通話連續做:

var result = $.ajax(url + "?d=" + A[0]); 
for (var i = 1 ; i < A.length ; i++) { 
    result = result.pipe(function() { 
    return $.ajax(url + "?d=" + a[i]); 
    } 
} 
result.done(processResults).fail(reportFailure); 
+0

事情是,我不希望他們並行。我希望他們序列化。 – eeeeaaii

+0

第二件事情似乎工作 - 謝謝 - 雖然我認爲可能有變量「我」的範圍問題 - 但這是可以解決的。 – eeeeaaii

相關問題