簡體   English   中英

setInterval()僅運行一次函數

[英]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函數,並將其返回值傳遞給setIntervalundefined )。 這就是在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM