2011-07-26 32 views
3

異步事件我只能運行一前一後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

你可以使用deferred objects jQuery的1.5推出。假設你的函數返回延期對象,就像$.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的結果的函數,然後簡單地傳遞給函數的引用,而不是寫文字,在這裏您鏈的定義是現貨。如果你使用這種模式,你可能需要調整參數如何從一個事件傳遞到另一個事件。

例如爲:

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

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

asyncronousEvent1(parameters1, handleEvent1); 

在這個例子中,沒有這些事件處理的來自同一封閉受益,因爲他們會在你原來的執行,這意味着你將需要制定出一些數據可見性的東西。

+0

問題在於代碼變得不靈活。因爲每次調用Event1時,其他2個事件也會被調用。有時,我只想調用事件1. – Randomblue

0

的值設置爲true每個事件的回調,並把條件燒製每個相關事件。

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

如果在'animate()'完成之前調用了'if(animated)'行,該怎麼辦?然後第二個'animate()'永遠不會被調用! – Randomblue

+0

好問題! :D – Mohsen

+0

但我總是在回調中調用其他函數。我不知道你爲什麼不喜歡它? – Mohsen