javascript - node.js setTimeout() 工作吗?

标签 javascript node.js

我是 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.doneLoadTablestrue 时,您可以使用 clearInterval 停止轮询。

关于javascript - node.js setTimeout() 工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33466933/

相关文章:

javascript - 如何在 Chrome 的 "developer bar"控制台中获得智能感知功能?

javascript - 什么是动画 DOM 元素最快的 CSS 显示属性

javascript - 菜单遍历下一个和上一个按钮单击

javascript - 使用 IDE (Node) 读取本地存储的 JSON 文件

node.js - PATH变量中的 Electron 为空?

javascript - 按复选框显示/隐藏 div 链接 jquery 过滤

javascript - JS不会将导航显示属性从none改为flex

javascript - NodeJS 自定义系统蜂鸣频率和持续时间

javascript - 使用 node.js、流和 promise 下载文件

node.js - 在 NodeJS 中测试数据库相关代码