2013-01-13 9 views
6

私はThread.Join()型のものを探しています。私はjavascriptで4つのイベントを引き起こすと言うことができます。コードを実行したいが、4つのコールバックがすべて完了した後でなければならない。それ、どうやったら出来るの?私が考えることができる唯一の方法は、グローバル変数を介して4つのコールバックが処理中であるかどうかを調べることです。この場合、無視するか例外をスローします。しかし、そうでない場合は、各コールバックでglobalVar ++のような処理を行い、globalVarが== 4かどうかをチェックする各コールバックの最後にIsItDone()を呼び出します。javascriptで複数のコールバック/スレッドに参加できますか?

しかし、私はそれを好きではありません。グローバル変数。

+0

テイク

は、あなたが呼び出すことができるため、あなたが求めているものを達成するために、 pubsub.jsを見てみると、イベントを一緒にストリングするのに本当に役立ちます。購読して発行するのは、登録された各イベントを順番に同期して行います(同期表示する場合)。 https://github.com/mroderick/PubSubJS – Gats

+0

これは直接回答ではないので、コメントとして追加しました。 – Gats

答えて

3

サイトにjQueryを追加しても構わない場合は、"deferred object"機能を使用できます。

各非同期関数(jQueryの組み込みAJAX関数を含む)は、後で何かを返すための「約束」を返すことができます。あなたの代わりに、それらの約束を含む配列pを持っていることを好む場合は、

$.when(p1, p2, p3, p4).done(function() { 
    // this will be called only when 
    // all of p1 - p4 have been "resolved" 
}); 

を代わりにこのよう$.whenを呼び出します:

$.when.apply($, p).done(function() { 
    ... 
}); 
+0

私はこれを使用すると思います –

7

あなたはキューを文字列にして、コールバックを自分でラップすることもできますが、それは毛むくじゃらしています。幸いにもそこには数多くの図書館があります。私はカウンターアプローチのファンではないので、コールバックがまだ解雇されていないことを時々知ることが難しいためです。

私は "Deferred"スタイルのファンです。 https://github.com/heavylifters/deferred-js

それとも全く別のAPIについて、Step.js https://github.com/creationix/step

またはこの問題をカプセル化し、他のマイクロlibsのためにここを参照してくださいを参照してください:このようなこのライブラリとしてhttp://microjs.com/#defer


それとも、それを行うに何らかの外部状態を設定して呼び出し、すべてのコールバックで共通のdone関数を呼び出すことで

var complete = { 
    first: false, 
    second: false 
}; 

doFirstAsync(function() { 
    complete.first = true; 
    allDone(); 
}); 

doSecondAsync(function() { 
    complete.second = true; 
    allDone(); 
}); 

var allDone = function() { 
    if (complete.first && complete.second) { 
    alert("done with all async!"); 
    } 
}; 

上記のライブラリのほとんどは、同様の方法でこれを行います。しかし、ただ抽象化され一般化されています。その一般化は、あらゆるものが飛び回るコールバック関数の配列を持っているので、物事が毛むくじゃらすることがある場所です。それは楽しい関数型プログラミングですが、概念的には複雑になります。

これをやりなおしている場合は、好きなAPIを持つlibを使用してください。

関連する問題