2010-05-12 24 views
0

我想確保我的理解正確的回調,和一般的JavaScript時機等。Javascript和時間,特別是與回調

說我的代碼看起來是這樣的,它是保證按次序執行?

SetList(); // initializes the var _list 

Some.Code(_list, function(data) { 

     // update list 

}); 

DoSomething(_list); // operates on _list 

更新

我所看到的是SETLIST電話,然後DoSomething的,然後Some.Code。

Some.Code調用另一個函數。所以:

Some.Code(_list, function() { 

    //load _list from ajax request 
    Other.Code.WithCallback(_list, function(){....}); 

}); 

我想解決這個問題,我要的DoSomething添加到內部函數作爲另一個回調?

回答

1

SetList()Some.Code()DoSomething()將按照該順序一個接一個地執行。作爲第二個參數傳遞給Some.Code()匿名函數可能的Some.Code()執行過程中被調用(在函數返回前,DoSomething()稱),或者可以在另一個函數以後的時間被調用,事件處理程序或定時器,這一切都取決於當你指定它被調用時。


由於您使用AJAX,向遠程服務器請求被在單獨的線程製成,所以執行JavaScript線程繼續運行,並調用其它函數直到響應(或者,更具體地,用於onreadystatechange事件發生)。當ajax請求的就緒狀態發生變化時,其readystatechange事件處理程序排隊等待被調用 - 意味着它將在所有當前正在執行的腳本完成後立即執行。

如果你想DoSomething()通過AJAX收到響應後執行的,你應該把它運行回調函數的末尾來代替。

+0

如何確保在調用DoSomething(_list)之前執行匿名函數; ? – Blankman 2010-05-12 16:37:01

+0

@Blankman:在該方法返回之前,您必須在'Some.Code()'方法期間的某個時刻調用它。 – 2010-05-12 16:39:58

+0

更新了我的問題.. – Blankman 2010-05-12 16:47:19

-1

該代碼,以便將執行:

SETLIST(),然後Some.Code(),然後函數(數據),然後DoSomething的()。

JavaScript是單線程的,並且爲了執行。如果在Some.Code()或函數(數據)中設置了一個調用另一個函數的時間間隔/定時器,唯一會出現不同步的情況就是這種情況。

如果您有:

var i=0; 
functionCall() //some long process that sets i=1; 
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); } 

這將提醒「爲了」但是,如果你有:

var i=0; 
setTimeout(functionCall, 1000) //some long process that sets i=1; 
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); } 

這將執行「十三不靠」因爲第三行將在調用functionCall()之前執行。

更新回答

由於您使用Ajax,我猜你正在異步調用,這是延遲的原因。你有一個回調函數,但它仍然等待被回調,所以Javascript在它等待時繼續執行下一行。

要在你希望的順序執行,你需要這樣做:

SetList(); // initilizes the var _list 
Some.Code(_list, function(data) { 
    // update list 
    DoSomething(_list); // operates on _list 
}); 

通過這種方式,可以確保DoSomething的()當你的回調方法被調用時被調用,而不是之前。

+0

函數(數據)不*按照您所說的順序執行。它作爲參數傳遞給Some.Code,並且可以隨時執行,或根本沒有,沒有足夠的信息可以說。 – Nathan 2011-04-19 02:44:52

+0

函數(數據)是否被調用實際上除了點。正如您在函數(數據)的結構中看到的那樣,將調用添加到DoSomething(_list)意味着它成爲回調方法的一部分 - 並在所有事件之前觸發,從而確保所需的順序。 – AlishahNovin 2011-04-20 15:23:46

相關問題