睡眠主线程但不阻止回调

时间:2017-09-10 02:35:53

标签: node.js node-deasync

此代码有效,因为system-sleep阻止主线程的执行但不阻止回调。但是,我担心系统睡眠不是100%可移植的,因为它依赖于依赖于C ++的deasync npm模块。

系统睡眠有其他替代方法吗?

result

PS理想情况下,我想要一个适用于Node 4+的解决方案,但任何东西都比没有好。

PPS我知道睡觉不是最好的做法,但我不在乎。我厌倦了反对睡觉的论点。

2 个答案:

答案 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)

根据您的要求将我的评论收集到答案中:

好吧,deasyncsleep()所依赖的)使用了很多黑客。它是一个本机代码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,然后运行其他事件。它根本就不是为了那样做而设计的。