0

此代码有效,因为系统睡眠会阻止主线程的执行,但不会阻止回调。但是,我担心 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 我知道睡觉不是最佳做法,但我不在乎。我厌倦了反对睡觉的争论。

4

2 回答 2

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();
}
于 2017-09-10T02:44:48.987 回答
1

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

好吧,deasync(这sleep()取决于)使用了相当多的技巧。它是一个本机代码 node.js 插件,可以从 C++ 代码手动运行事件循环,以完成它正在做的事情。只有真正了解 node.js 内部(现在和将来)的人才能想象这样做的问题所在。如果不破解 node.js 本机代码,您所要求的内容在常规​​ Javascript 代码中是不可能的,因为它与 Javascript 设计为在 node.js 中运行的方式完全相反。

明白并感谢。我正在尝试编写一个不使用 hack 的更可靠的 deasync(在某些平台上失败)模块。显然,我给出的这种方法不是答案。我希望它支持节点 4。我现在正在考虑将 yield / async 与 babel 结合使用,但我不确定这也是我所追求的。我需要一些东西,它会等到回调被解决,然后从异步回调中返回值。

Babel 所做的async/await只是为你编写常规promise.then()代码。async/await是语法便利。他们并没有真正做任何你不能用 Promise 自己编写的事情.then().catch()在某些情况下Promise.all()。所以,是的,如果你想async/await为节点 4 编写样式代码,那么你可以使用 Babel 将你的代码转换为将在节点 4 上运行的东西。你可以在使用时查看转换后的 Babel 代码async/await,你会发现常规promise.then()代码.

没有任何deasync解决方案不是对引擎的破解,因为引擎的设计初衷不是为了实现 deasync 的功能。

node.js 中的 Javascript 旨在一次运行一个 Javascript 事件,并且该代码一直运行,直到它将控制权返回给系统,然后系统将从事件队列中提取下一个事件并运行其回调。您的 Javascript 是单线程的,设计上没有先发制人的中断。如果没有对 JS 引擎进行某种破解,您就无法暂停或休眠一段 Javascript,然后再运行其他事件。它根本不是为了做到这一点而设计的。

于 2017-09-11T21:31:58.223 回答