此代码有效,因为system-sleep阻止主线程的执行但不阻止回调。但是,我担心系统睡眠不是100%可移植的,因为它依赖于依赖于C ++的deasync npm模块。
系统睡眠有其他替代方法吗?
result
PS理想情况下,我想要一个适用于Node 4+的解决方案,但任何东西都比没有好。
PPS我知道睡觉不是最好的做法,但我不在乎。我厌倦了反对睡觉的论点。
答案 0 :(得分:1)
var one = 0;
function delay(){
return new Promise((resolve, reject) => {
setTimeout(function(){
resolve('resolved')
}, 2000);
})
}
while (one == 0) {
one = 1;
async function f1(){
var x = await delay();
if(x == 'resolved'){
x = '';
one = 0;
console.log('resolved');
//all other handlers go here...
//all of the program that you want to be affected by sleep()
f1();
}
}
f1();
}
答案 1 :(得分:1)
根据您的要求将我的评论收集到答案中:
好吧,deasync
(sleep()
所依赖的)使用了很多黑客。它是一个本机代码node.js附加组件,它从C ++代码手动运行事件循环,以便执行它正在执行的操作。只有真正了解node.js(现在和未来)内部的人才能想象出这样做的问题。在没有破坏node.js本机代码的情况下,常规Javascript代码无法满足您的要求,因为它与Javascript设计为在node.js中运行的方式完全相反。
理解并感谢。我正在尝试编写一个更可靠的deasync(在某些平台上失败)模块,它不使用hack。显然,我给出的这种方法不是答案。我希望它支持Node 4.我正在考虑将yield / async与babel结合使用,但我不确定那是我追求的。我需要等待回调被回调的东西,然后从异步回调中返回值。
所有Babel与async/await
合作的是为您编写常规promise.then()
代码。 async/await
是语法便利。他们并没有真正做任何你不能使用承诺.then()
,.catch()
以及在某些情况下Promise.all()
自己写的东西。所以,是的,如果你想为节点4编写async/await
样式代码,那么你可以使用Babel将你的代码转换为将在节点4上运行的代码。你可以在使用{{{}时查看已转换的Babel代码。 1}},您将找到常规的async/await
代码。
没有promise.then()
解决方案不是引擎的黑客,因为引擎不是为了执行deasync而设计的。
node.js中的Javascript被设计为一次运行一个Javascript事件,该代码一直运行,直到它将控制权返回给系统,系统将从事件队列中提取下一个事件并运行其回调。您的Javascript是单线程的,没有设计先发制人的中断。 如果没有JS引擎的某种破解,你不能暂停或睡眠一个Javascript,然后运行其他事件。它根本就不是为了那样做而设计的。