setTimeout(number) 导致中断 node.js REPL
setTimeout(number) cause breaking node.js REPL
例如,当我在 node.js REPL 终端中写入时:
setTimeout(3);
它向我显示了这个错误:
timers.js:110
first._onTimeout();
^
TypeError: Property '_onTimeout' of object [object Object] is not a function
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
但是,有趣的是它破坏了整个会话(而不是仅仅抛出错误)。
为什么会这样?
谢谢。
PS:我知道我应该添加函数作为第一个参数。只是想知道为什么它会中断会话。
当您使用 setTimeout
或 setImmediate
时,它会将您的 callback
添加到事件队列中,因为 Node 无法保证您的回调将在 [=13] 中准确触发=].由于 3
不是函数,它无法触发,引发异常并在完成返回到您的执行范围之前退出,这就是它会终止 REPL 的原因。
现在,这与提供回调和在那里发生错误不同,因为回调将在调用脚本的执行范围内定义。如果您的回调要抛出错误,它将在正确的范围内引发异常。请注意,Node 不像大多数浏览器那样支持回调 arg 的字符串。
对于如此低的超时,您最好使用 process.nextTick(callback)
,这对于性能和安全性来说要好得多,但您仍然会在顶层看到一个错误。
你应该使用
setTimeout(function() {
console.log('This runs every minute');
}, 60000);
正如 Dave 所说,setTimeout 需要一个函数。 http://www.w3schools.com/jsref/met_win_settimeout.asp
例如,当我在 node.js REPL 终端中写入时:
setTimeout(3);
它向我显示了这个错误:
timers.js:110
first._onTimeout();
^
TypeError: Property '_onTimeout' of object [object Object] is not a function
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
但是,有趣的是它破坏了整个会话(而不是仅仅抛出错误)。
为什么会这样?
谢谢。
PS:我知道我应该添加函数作为第一个参数。只是想知道为什么它会中断会话。
当您使用 setTimeout
或 setImmediate
时,它会将您的 callback
添加到事件队列中,因为 Node 无法保证您的回调将在 [=13] 中准确触发=].由于 3
不是函数,它无法触发,引发异常并在完成返回到您的执行范围之前退出,这就是它会终止 REPL 的原因。
现在,这与提供回调和在那里发生错误不同,因为回调将在调用脚本的执行范围内定义。如果您的回调要抛出错误,它将在正确的范围内引发异常。请注意,Node 不像大多数浏览器那样支持回调 arg 的字符串。
对于如此低的超时,您最好使用 process.nextTick(callback)
,这对于性能和安全性来说要好得多,但您仍然会在顶层看到一个错误。
你应该使用
setTimeout(function() {
console.log('This runs every minute');
}, 60000);
正如 Dave 所说,setTimeout 需要一个函数。 http://www.w3schools.com/jsref/met_win_settimeout.asp