【发布时间】:2026-01-30 05:40:01
【问题描述】:
此代码有效,因为system-sleep 阻止了主线程的执行,但不阻止回调。但是,我担心 system-sleep 不是 100% 可移植的,因为它依赖于依赖 C++ 的 deasync npm 模块。
是否有任何替代系统睡眠的方法?
var sleep = require('system-sleep')
var done = false
setTimeout(function() {
done = true
}, 1000)
while (!done) {
sleep(100) // without this line the while loop causes problems because it is a spin wait
console.log('sleeping')
}
console.log('If this is displayed then it works!')
PS 理想情况下,我想要一个适用于 Node 4+ 的解决方案,但有总比没有好。
PPS 我知道睡觉不是最佳做法,但我不在乎。我厌倦了反对睡觉的争论。
【问题讨论】:
-
哦,总而言之,只有主线程运行回调/事件,所以如果你阻塞主线程(node.js 只在主线程中运行 Javascript),来自事件队列的回调也会被阻塞。你无法改变这一点。因此,您的标题所要求的根本不是您在 node.js 中可以做到的。
-
@jfriend00 如果它在节点中不可能,那么为什么我在问题中给出的代码有效?请正确阅读。我知道如何使用承诺和回调。由于我自己的原因,我不想在这里使用它们。此外,我使用的是 Node 4,因此我无法使用 async/await。
-
进一步研究表明,deasync 是另一个项目的分支。另一个项目警告不要使用它,因为它只是一个 hack。由于系统睡眠依赖于异步,我也不会使用它。
-
好吧,
deasync(sleep()依赖于此)使用了相当多的技巧。它是一个本机代码 node.js 插件,可以从 C++ 代码手动运行事件循环,以完成它正在做的事情。只有真正了解 node.js 内部(现在和将来)的人才能想象这样做的问题所在。如果不破解 node.js 本机代码,您所要求的内容在常规 Javascript 代码中是不可能的,因为它与 Javascript 设计为在 node.js 中运行的方式完全相反。这就是我想与您交流的内容。 -
所有 Babel 对 async/await 所做的只是为你编写常规的
promise.then()代码。async/await是语法便利。他们并没有真正做任何你不能用 Promise、.then()、.catch()和在某些情况下Promise.all()编写的事情。所以,再一次,我真的不明白你想要完成什么。是的,如果您想为节点 4 编写async/await样式代码,那么您可以使用 Babel 将您的代码转换为将在节点 4 上运行的东西。没有任何非同步解决方案不是对引擎的破解,因为引擎的设计初衷不是做 deasync 所做的事情。
标签: node.js node-deasync