2011-07-02 3 views
1

2つの条件が満たされるまで、JavaScript関数の呼び出しを遅らせる方法はありますか?jQueryまたはJavaScriptのダブル遅延

私はslideUp()アニメーションと同時に開始する.get()関数を持っていますが、いずれか最初に終了することができます。私は両方が完了したときに呼び出される関数をしたい。

答えて

3

すべての関連情報について、カウンタまたは(私が推奨する方法)フラグを追跡するだけで済みます。今

var slideDone, getDone; 

$("#foo").slideUp(function() { 
    slideDone = true; 
    nextThing(); 
}); 
$.get({ 
    // ... 
    success: function() { 
     getDone = true; 
     nextThing(); 
    } 
}); 

function nextThing() { 
    if (slideDone && getDone) { 
     // Do the next thing 
    } 
} 

、明らかにそうではないん上記の私の2つの条件が非常に人工的ですが、私はこれが私の本当の仕事で起動しますほとんどの時間は、私がチェックするために使用することができます実際の情報を持っていることを見つけて、人工的な条件に頼る。競合状態のように見えるマルチスレッドプログラミング、(?どのような場合slideUp完了我々はgetを開始前)に使用誰かに

var counter = 0; 

++counter; 
$("#foo").slideUp(function() { 
    nextThing(); 
}); 
++counter; 
$.get({ 
    // ... 
    success: function() { 
     nextThing(); 
    } 
}); 

function nextThing() { 
    if (--counter === 0) { 
     // Do the next thing 
    } 
} 

が、それは一つではないのです。

またはカウンターブラウザ上のJavaScriptではシングルスレッドである(web workersの使用を除いて、上記にはあてはまらない構文を使用する)。

これがたくさん出てくることがわかったら、もちろん論理に分離することができます(はたくさんありますが ...)をオブジェクトに入れて再利用します。

+0

グレートコードサンプル。 +1 –

+0

グローバルスコープをきれいにするために、全体を '(function(){})()'にラップする必要があります。 – user123444555621

+0

@ Pumbaa80:ある種のスコープが暗示されています。私はこれがトップレベルのスクリプトだと言っているのではなく、彼がこれをやっているところで彼が彼の職場でやっていることが何であるかということです。 –

0

メソッドを代理する両方のメソッドがacesssを持ち、以前のメソッドが実行されたかどうかをチェックする単純なブール変数を作成できます。

この方法で、前の関数が完了して何らかの方法を実行するとデリゲート関数をチェックインすることができます。

T.J. Crowdersの回答には、このアプローチの良いコード例がいくつか含まれています。それはあなたが必要なもののために、実際に最適です http://api.jquery.com/category/deferred-object/

0

あなたはjQueryの繰延オブジェクトを使用することができます。バインドされたすべての遅延オブジェクトが解決されたときに実行するように関数を設定できます。 jQueryのネイティブ関数の中には、デフォルトで$ .ajaxやアニメーションも含めて遅延オブジェクトが返されます(少なくともjQueryの最新バージョン)

ドキュメントを読むと、説明がもっとうまくいくでしょうそれは私ができるよりも。