2012-01-19 24 views
4

我想打電話給jQuery的延遲功能於一身的循環,但每次迭代應等待前一次迭代使用來完成遞延when()循環與每次迭代只發生在jQuery推遲時/然後可能沒有遞歸?

function (num_of_iterations) { 

    var arr = []; 

    for (var i = 1; i < num_of_iterations; ++i) { 
     arr.push($.getJSON(... 1 ...)); 
     arr.push($.getJSON(... 2 ...)); 
     ... 

     $.when.apply($, arr).then(function() { 
     // somehow do the next iter. only now that all the asynch getJSON's are done 
     }); 
    } 
    return; 
    } 

現在當然因爲getJSON是異步的所有迭代所有的請求實際上會在調用任何when之前發送。

我知道我可以通過調用一個函數來實現這個遞歸,這個函數包含了我在這裏的then

但我想知道是否有一些技術,我錯過了,而不是遞歸。我總是擔心在將來某個時候使用堆棧的遞歸。參數num_of_iterations可能會非常大。

我可以使用pipe()嗎?我在處理文檔時遇到了很多麻煩,關於它的所有關於過濾的討論......

回答

0

函數鏈接和遞歸在異步JavaScript中是非常自然的事情。正如for語句中所看到的,您的循環將運行10次。這意味着你也將有一個10的遞歸堆棧,所以沒有必要擔心棧的大小(除非你搞砸了你的返回條件,並且它永遠運行)。

+0

那麼這只是簡化的示例代碼。真正的數字來自外部的API,它只會隨着時間的推移而增加,我想考慮未來,以及滿足我的好奇心。我會更新我的例子... – hippietrail

+1

好吧,我很快測試了它,並得到了30000左右的數量太多的遞歸錯誤(如果您正在爲每個循環提出幾個請求,這可能意味着您將輕鬆製作超過十萬請求 - 這可能是首先要擔心的事情)。這就是說,你可能也想看看async.js https://github.com/caolan/async – Daff

1

我想你可以在這種情況下使用管道鏈接。看看這個工作jsfiddle,讓我知道如果這是或多或少你在找什麼。 http://jsfiddle.net/tchaffee/Df3ay/3/

+0

只需要注意提到'.pipe()'現在在jQuery中被棄用了,'.then()'主要是爲了與延遲/承諾概念的其他JavaScript實現兼容的原因而包含其功能。 – hippietrail