setInterval()只运行一次函数

时间:2012-01-04 18:46:07

标签: javascript setinterval

我想定期查询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"一旦。我确保控制台不会再忽略相同字符串的日志,所以如果代码工作正常,它应该显示" tick"在控制台每一秒。

任何人都知道这里可能出现什么问题?

6 个答案:

答案 0 :(得分:24)

变化:

setInterval(getMessages(), queryInterval);

要:

setInterval(getMessages, queryInterval);

答案 1 :(得分:9)

实际上,setInterval根本没有运行getMessages(甚至没有运行一次)。 setInterval期望引用到函数,但是您正在立即执行getMessages函数 并将其返回值传递给setIntervalundefined)。这就是getMessage之后的问题。

像这样传递setInterval的引用:

setInterval(getMessages, queryInterval);

如果这是唯一使用getMessages的地方,那么您也可以这样写:

setInterval(function() {
    console.log("tick");
}, queryInterval);

答案 2 :(得分:2)

()

之后删除getMessage

答案 3 :(得分:2)

调用 getMessages,不安排它。删除括号。

setInterval(getMessages(), queryInterval);

setInterval(getMessages, queryInterval);

答案 4 :(得分:0)

虽然其他人已经涵盖了上述内容,但window.setTimeout()和window.setInterval()都需要函数 references 。相反,您的代码会从函数调用中提供返回值

当您希望调用或调用JavaScript函数时,您可以按预期编写:

DoMyfunction();

JavaScript引擎会在遇到该行时执行该功能。

但是,setTimeout()和setInterval()需要的是对函数对应的函数对象引用。您通过以下方式获得的,以及类似的方式:

myFunc = DoMyFunction;

该行将对与DoMyFunction()对应的函数对象的引用复制到一个新变量中。然后您可以将其传递给setInterval()和setTimeout(),即:

discard = window.setTimeout(myFunc,1000);

上面的那一行将指示JavaScript引擎在经过1秒后执行一次预期的函数(即DoMyFunction()),并且:

discard = window.setInterval(myFunc,1000);

将指示JavaScript引擎重复执行您想要的功能,每秒一次。

当然,您可以在不使用新变量的情况下实现相同的效果,如下所示:

discard = window.setTimeout(DoMyFunction,1000);

但是,如果您犯了错误:

discard = window.setTimeout(DoMyFunction(),1000);

反而会发生DoMyFunction(),并且由此产生的任何返回参数都是然后传递给window.setTimeout()函数。由于window.setTimeout()期望在此处传递函数对象引用,而是接收函数返回的任何内容(如果函数不返回任何内容,则 undefined ),然后由setTimeout()执行内部检查(和setInterval())会显示它在这里没有收到函数对象引用,只是静默地中止。

当然,如果DoMyFunction()实际确实返回有效的函数对象,则会出现更加阴险的错误!如果您已经编写了DoMyFunction()来执行此操作,那么那个函数对象将被传递给setTimeout(),而那个函数将被运行!当然,您可以有意使用它,并将DoMyFunction()编写为闭包,返回实际函数,希望setTimeout()作为函数对象返回参数执行,如果使用方法,然后是表格:

discard = window.setTimeout(DoMyFunction(),1000);

将不再是错误的。

请记住,您在代码中编写的每个 JavaScript函数,在解析该代码时,都由JavaScript引擎与函数对象相关联。要执行该功能,请使用:

DoMyFunction();

要引用功能对象,请使用:

DoMyFunction;

由于JavaScript采用这种方法来区分函数对象引用,因此那些()可以根据上下文产生巨大的差异>功能执行指令

答案 5 :(得分:0)

检查您的代码行:

setInterval(getMessages(), queryInterval);

setInterval函数要求您将引用传递给回调函数。

当您传递getMessages(),时,您实际上正在调用该函数并将其返回的对象传递给setInterval函数。

所以只需将您的行改为:

setInterval(getMessages, queryInterval);

它会正常工作!