2011-07-26 21 views
3

3つの非同期イベントがありますが、それらは順番にしか実行できません。最初の非同期イベントが完了すると、2番目の非同期イベントが実行されます。 2番目のイベントが完了すると、3番目のイベントが実行されます。示すように私のコードは次のとおりです。jQueryでの非同期イベントの処理

asynchronousEvent1(parameters1, function() { // Do stuff 
    asynchronousEvent2(parameters2, function() { // Do stuff 
     asynchronousEvent3(parameters3, function() { // Do stuff 
     }); 
    }); 
}); 

この電流形式は、私は別の内にネストされた関数の長いシーケンスを持っている必要があることを意味します。

asynchronousEvent1(parameters1, function() { /* Do stuff */ }); 
whenEvent1Completed(asynchronousEvent2(parameters2, function() { /* Do stuff */ }); 
whenEvent2Completed(asynchronousEvent3(parameters3, function() { /* Do stuff */ }); 
+0

おそらくこれがあなたが探しているものですか? http://api.jquery.com/category/deferred-object/ –

答えて

3

jQuery 1.5で導入されたdeferred objectsを使用できます。あなたの関数は(あなたが独自に作成することができますまたはコースの)$.ajaxによって返されたものと同様、繰延オブジェクトを返すと仮定:

asynchronousEvent1(parameters1).pipe(function() { 
    // do stuff 
    return asynchronousEvent2(parameters2); 
}).pipe(function() { 
    // do stuff 
    return asynchronousEvent3(parameters3); 
}).then(function() { 
    //do stuff 
}); 

deferred.pipe[docs]の最後の例を見てください。

1

私は必ずしもこれが答えますが、アイデアのよりであることを考慮していない:コードの形式は、およそだろうそのため、私が使用できるイベントハンドラのいくつかの並べ替えは、そこにあります。実際の生活の中でどのようにコードが配置されているのか分かりませんが、関数をロードした配列を使用してその順序で呼び出す可能性があります。次に、リスト内の次のものをチェックし、それを呼び出します。私は働くかどうかはわかりませんが、それはアイデアです。

JMAX

+0

各イベントの完了時期はどのようにして判断できますか? – Randomblue

+0

これは別の関数を呼び出します。私はあなたの配列にあったメソッドを呼び出してevalを使うことを想像することができます。それは非常に拡張性があります。ちょうどここに興味がある。 –

0

私は、私は完全にあなたが探しているものを理解していません。

たとえば、イベント1の結果を処理する関数を定義して、チェーンが定義されている場所にリテラルを書き込むのではなく、その関数への参照を渡すだけで済みます。そのパターンを使用する場合は、パラメータが1つのイベントから別のイベントにどのように渡されるかを微調整する必要があります。彼らはあなたには、いくつかのデータの可視性のものをうまくする必要がありますを意味し、あなたのオリジナルの実装では、同じように

例えば:この例では

function handleEvent1() { 
    // do something 
    asynchronousEvent2(parameters2, handleEvent2); 
} 

function handleEvent2() { 
    // do something 
    asynchronousEvent3(parameters3, handleEvent3); 
} 

asyncronousEvent1(parameters1, handleEvent1); 

は、これらのイベントハンドラはどれも同じ閉鎖の恩恵を受けていません。

+0

その問題は、コードが柔軟性に欠けることです。イベント1が呼び出されるたびに、他の2つのイベントも呼び出されるためです。場合によっては、イベント1を呼び出すだけです。 – Randomblue

0

各イベントコールバックおよびput条件ごとに値を設定して、それぞれの依存イベントを発生させます。

$('blah').animate({},1000,function(){animated = true} 
if(animated){$('blahblah').animate()...} 
+0

'animate()'が終了する前に 'if(animated)'行が呼び出されるとどうなりますか?次に、2番目の 'animate()'は決して呼び出されません! – Randomblue

+0

良い質問です! :D – Mohsen

+0

しかし、私は常に他の関数をコールバックで呼び出します。なぜあなたはそれが気に入らないのですか? – Mohsen

関連する問題