2011-11-13 69 views
2

這是Javascript在單線程上線性執行的問題。javascript:一旦變量更新後,在稍後的時間點執行函數

使用

setTimeout(function(){},time); 

被評估,並立即執行function()

我正在尋找在x秒內執行function()的方法,例如在dom從ajax調用更新後。

這是如何完成的?

換句話說,只需要'暫停'腳本,然後讓它知道何時執行。

爲了清楚起見,如果你在function()中做了這樣的事情;

 var a= document.getElementbyId("anid").innerHTML; 

var a將在setInterval處理時收集,而不是在x秒內執行該函數。

謝謝...

+0

號這將在'time'規定(假設'time'包含數字)的毫秒數後執行的函數,而不是馬上。 – Quentin

回答

2

較好的是,你的Ajax調用完成後執行的功能。您可以註冊一個成功/失敗功能,一旦通話結束,該功能將被呼叫。這是做到這一點的正確方法。

下面是用jQuery的例子:

$.ajax({ 
    url: "test.html", 
    context: document.body, 
    success: function(){ 
    // here you do whatever you want after ajax is finished 
    } 
}); 

**編輯** 刪除的建議,通過回調函數基於昆汀的評論下面,一個字符串,因爲它確實不是一個好的做法。

+3

**永不**將字符串傳遞給'setTimeout',它很慢且很難調試,傳遞函數是正確的方法,不應該導致問題中描述的行爲。另外,如果你傳遞一個字符串,那麼它需要是一個表達式,而不是一個函數的名字(OK,所以函數的名字是一個表達式,它在這個上下文中沒有用)。 – Quentin

+0

@Quentin thx很有意思。我見過的所有例子都是傳遞一個字符串。我編輯我的答案,包括()使其更清晰 – santiagoIT

+0

現在它會工作(好吧,它將如果'functionYouWishToCall'是一個全球性),只是速度慢,效率低,難以調試。 – Quentin

2

setTimeout的示例不會立即執行該函數,而是在等待由'time'指定的毫秒數之後。例如,要在3秒內顯示一個警告:

window.setTimeout (function() { alert ('Test'); }, 3000); 

請注意,即使您使用0作爲時間值時,execution of the function is still delayed until the current Javascript execution stack ends,這是在某些情況下而不是在你的情況是有用的。

正如santiagoIT所說,您絕不應該依賴這種策略來執行任何取決於特定AJAX調用完成的操作。相反,你應該使用回調函數。這是因爲在使用定時器時,在您的函數執行時(例如,如果計算機運行緩慢),DOM仍可能沒有準備好,此線程問題在計算機科學中稱爲「競爭條件」。

爲避免競爭條件,請使用回調函數。使用jQuery庫的例子看起來像:

$.get("/url/ajax/getSomething", parameterArray, callbackFunction); 

function callbackFunction(data) { 
    alert ('Work with DOM here'); 
} 
相關問題