我想定期查询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"在控制台每一秒。
任何人都知道这里可能出现什么问题?
答案 0 :(得分:24)
变化:
setInterval(getMessages(), queryInterval);
要:
setInterval(getMessages, queryInterval);
答案 1 :(得分:9)
实际上,setInterval
根本没有运行getMessages
(甚至没有运行一次)。 setInterval
期望引用到函数,但是您正在立即执行getMessages
函数 并将其返回值传递给setInterval
(undefined
)。这就是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);
它会正常工作!