我是 Node.js 新手。我需要做些什么才能让 setTimeout() 工作吗?
这是一个代码片段。
完成后设置 appMsg.doneLoadTables = true 的异步代码
do {
console.log('waiting ... ' + appMsg.doneLoadTables);
setTimeout(function() { console.log('waiting ...'); }, 1000);
} while (!appMsg.doneLoadTables);
症状:
- (虽然对 console.log 的两次调用很相似,但只有第一次打印 appMsg.doneLoadTables 的值。)每个结果都包含该值。
- 调用 console.log 的间隔远小于 1000 毫秒。 (我怀疑间距与计算机处理此处显示的循环一样快。)
- 虽然我希望异步例程可以在我在这里预期的延迟期间继续处理,但我从未见过这个循环结束;就好像循环占用了所有处理资源并阻止异步例程完成它们的工作并阻止设置将结束此循环的变量。
我有过 Node 4.2.1 的经验;我在安装 Node 5.0.0 后仍然有这种体验。
我看到以前在这里多次询问过关于 setTimeout() 的类似问题。我希望我在 setTimeout() 中使用 IIFE 可以使这个问题与所有这些问题区分开来。
在此先感谢您提供的任何帮助...
最佳答案
JavaScript 是单线程的。 setTimeout
不是 sleep
的一种形式,它会在该行暂停代码。它的工作原理是“安排”你的回调以供稍后使用,并在堆栈耗尽(引擎什么都不做)时执行它,并且至少在 n
毫秒后执行,其中 n
是以毫秒为单位的延迟。
现在您的代码无法运行,因为它永远不会退出循环。该代码没有机会执行其他代码(您希望运行并更改 appMsg.doneLoadTables
的值的代码)。它所做的一切都在记录“等待……[某事]”。
本质上你是在投票。您可以改用 setInterval
。当 appMsg.doneLoadTables
为 true
时,您可以使用 clearInterval
停止轮询。
关于javascript - node.js setTimeout() 工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33466933/