2011-07-02 40 views
1

有沒有辦法延遲調用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 
    } 
} 

現在,很明顯我的上述兩個條件都十分做作,但我發現,大部分在我的實際工作時,該出現的時候,我有實際的信息,我可以使用支票,所以不訴諸人爲條件。

或計數器:

var counter = 0; 

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

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

給別人使用多線程編程,看起來像一個競爭條件(?如果slideUp完成之前,我們開始get什麼),但它不是一個在瀏覽器上使用JavaScript,它是單線程的(禁止使用web workers,它使用的語法不適用於上述內容)。

如果你發現這個提升了很多,你當然可以總是把它的邏輯(不是它的lot,但是......)分解成一個對象並重用它。

+0

偉大的代碼示例。 +1 –

+0

你應該把整個東西包裝在一個'(function(){})()'中,以保持全局範圍的清潔 – user123444555621

+0

@ Pumbaa80:暗示某種範圍。我並不是說這是頂級腳本,而是他在做他的功能時可能做的。 –

0

您可以創建一個簡單的布爾變量,這兩個委託方法都可以訪問並檢查前一個方法是否已執行。

這樣,您可以檢查您的委託功能,如果前一個功能已完成並執行某種方法。

T.J. Crowders答案包括這種方法的一些很好的示例代碼。

0

您可以使用jQuery的Deferred對象: http://api.jquery.com/category/deferred-object/

這是您所需要的真正的完美。您可以將函數設置爲只有在所有綁定到它的延遲對象都解析後才執行。一些jQuery的本地函數默認返回一個延遲對象,比如$ .ajax,我也相信動畫(至少jQuery的最新版本)

閱讀文檔,它會更好地解釋它比我能。