[英]setInterval() only running function once
我想定期查詢PHP腳本中的新消息。 為此,我使用了setInterval()函數和AJAX。
$(document).ready(function(){
var queryInterval = 1000; /* How fast we query for new messages */
setInterval(getMessages(), queryInterval);
function getMessages() {
console.log("tick");
}
});
但是,當我查看Javascript控制台時,只看到一次“滴答”。 我確保控制台不會再忽略相同字符串的日志,因此,如果代碼正常運行,它應該每秒在控制台中顯示“ tick”。
有人知道這里可能出什么問題嗎?
更改:
setInterval(getMessages(), queryInterval);
至:
setInterval(getMessages, queryInterval);
實際上, setInterval
根本不運行getMessages
(甚至不運行一次)。 setInterval
需要對函數的引用 ,但是您要立即執行getMessages
函數,並將其返回值傳遞給setInterval
( undefined
)。 這就是在getMessage
之后執行的操作。
像這樣傳遞對setInterval
的引用:
setInterval(getMessages, queryInterval);
如果這是使用getMessages
的唯一地方,那么您也可以這樣編寫:
setInterval(function() {
console.log("tick");
}, queryInterval);
在getMessage
之后刪除()
這將調用 getMessages
,而不是對其進行調度。 刪除括號。
setInterval(getMessages(), queryInterval);
setInterval(getMessages, queryInterval);
盡管其他人已經在上面對此進行了介紹,但是window.setTimeout()和window.setInterval()都需要函數引用 。 您的代碼將提供函數調用的返回值 。
當您希望調用或調用JavaScript函數時,可以按預期編寫:
DoMyfunction();
JavaScript引擎將在遇到該行時執行該功能。
但是,setTimeout()和setInterval()需要的是對與您的函數相對應的函數對象的引用 。 您可以通過以下類似方式獲得:
myFunc = DoMyFunction;
該行將對與DoMyFunction()對應的功能對象的引用復制到新變量中。 然后可以將其傳遞給setInterval()和setTimeout(),即:
丟棄= window.setTimeout(myFunc,1000);
上面的那一行將指示JavaScript引擎在經過1秒后執行一次您想要的函數(即DoMyFunction()),並且:
丟棄= window.setInterval(myFunc,1000);
將指示JavaScript引擎每秒一次重復執行您想要的功能。
您當然可以在不使用新變量的情況下達到相同的效果,簡單如下:
丟棄= window.setTimeout(DoMyFunction,1000);
等等
但是,如果您犯了以下錯誤:
丟棄= window.setTimeout(DoMyFunction(),1000);
而是執行DoMyFunction(), 然后將由此產生的所有返回參數傳遞給window.setTimeout()函數。 由於window.setTimeout()期望在此處傳遞函數對象引用,並且接收到函數返回的任何內容(如果函數什么都不返回,則返回未定義的值),因此setTimeout()(和setInterval())執行的內部檢查將揭示它在這里沒有收到函數對象引用,而只是簡單地中止。
如果DoMyFunction()實際上確實返回了一個有效的函數對象,則可能會產生更加隱蔽的錯誤! 如果您編寫了DoMyFunction()來執行此操作,則該函數對象將傳遞給setTimeout(),並且該函數將運行! 當然,您可以有意地使用它,並將DoMyFunction()作為閉包編寫,返回希望setTimeout()作為函數對象返回參數執行的實際函數,如果使用該方法,則采用以下形式:
丟棄= window.setTimeout(DoMyFunction(),1000);
將不再是錯誤的。
請記住,解析代碼后,您在代碼中編寫的每個 JavaScript函數都會由JavaScript引擎與一個函數對象相關聯。 要執行該功能,請使用:
DoMyFunction();
要引用功能對象 ,請使用:
DoMyFunction;
由於JavaScript采取這種方法來區分功能對象引用和功能執行指令,這些()會根據上下文產生巨大的差異。
檢查您的代碼行:
setInterval(getMessages(), queryInterval);
setInterval
函數要求您將引用傳遞給回調函數。
當傳遞getMessages(),
實際上是在調用該函數並將其返回對象傳遞給setInterval
函數。
因此,只需將行更改為:
setInterval(getMessages, queryInterval);
它將正常工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.