我正在编写一个长轮询脚本并遇到一个too much recursion挂起浏览器的错误.我的目标是每1000ms使用相同的功能setTimeout().是的,我可以使用,setInterval()但它将是一个长轮询脚本,并将等待服务器响应.
我通过删除()我在同一个函数中调用的函数来解决这个问题.
我的脚本看起来像:
function messagePolling(){
console.log("polled")
setTimeout(messagePolling(),1000) // <--- removing `()` from the function works as intended
}
messagePolling();
Run Code Online (Sandbox Code Playgroud)
这背后的逻辑是什么?messagePolling毕竟不是它的功能.
你是绝对正确的 - messagePolling是一个功能.然而,messagePolling()是不是一个函数.您可以在控制台中看到它:
// assume messagePolling is a function that doesn't return anything
messagePolling() // -> undefined
Run Code Online (Sandbox Code Playgroud)
所以,当你这样做时:
setTimeout(messagePolling(), 1000)
Run Code Online (Sandbox Code Playgroud)
你真的这样做:
setTimeout(undefined, 1000)
Run Code Online (Sandbox Code Playgroud)
但是当你这样做时:
setTimeout(messagePolling, 1000)
Run Code Online (Sandbox Code Playgroud)
你实际上是将函数传递给了setTimeout.然后setTimeout将知道运行你传递的功能messagePolling- 稍后.如果它决定稍后调用undefined(结果messagePolling()),它将无法工作,对吧?
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |