2012-01-19 5 views
4

私はループでjQueryの延期関数を呼び出すしたいがgetJSONはすべての反復ですべての要求が実際になり、非同期であるため、各反復が延期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; 
    } 

を使用して完了するために、以前の反復を待つべきwhenのいずれかが呼び出される前に送信されます。

私はthenでここにあるものをラップする関数を呼び出すことでこれを達成できます。

しかし、私は再帰の代わりに使用するために欠けている技術があるのだろうかと思っています。私はいつもスタックのある時点で再帰を心配しています。パラメータnum_of_iterationsは、潜在的にかなり大きい可能性があります。

これにはpipe()を使用できますか?私は、フィルタリングに関するすべての話をして、ドキュメントをgrokkingしています。

答えて

0

非同期JavaScriptでは、関数の連鎖と再帰は非常に自然なことです。 forステートメントで見られるように、ループは10回実行されます。これは、10の再帰スタックも持つことを意味します。したがって、実際にスタックサイズを心配することはありません(復帰条件が悪化し、永遠に実行されない限り)。

+0

これは単なるコード例です。実数は、時間の経過とともに増加する外部APIから来ており、私は好奇心を満足させるだけでなく、将来を許したいと考えています。私は私の例を更新します... – hippietrail

+1

私はすぐにそれをテストし、30000の数の回りにあまりにも多くの再帰エラーを持っています(あなたが簡単に10万を超えることを意味するかもしれない各ループのいくつかの要求をしているならリクエスト - おそらく最初に心配するものです)。つまり、async.js https://github.com/caolan/async – Daff

1

この場合、パイプチェインを使用できると思います。この作業中のjsfiddleをチェックして、これが多かれ少なかれあなたが探しているものかどうかを教えてください。 http://jsfiddle.net/tchaffee/Df3ay/3/

+0

を見てみるといいでしょう。 '.pipe()'がjQueryで廃止され、 '.then()'が廃止されました。主に遅延/約束の概念の他のJavaScript実装との互換性のためにその機能を包含する。 – hippietrail

関連する問題