Node.js 节点js的回调队列排序

Node.js 节点js的回调队列排序,node.js,Node.js,例1: console.log('Starting app'); setTimeout(() => { console.log('callback 1'); }, 2000); sleep(4000); setTimeout(() => { console.log('callback 2'); }, 1000); console.log('Finishing up'); function sleep(milliseconds) { var start = new

例1:

console.log('Starting app');

setTimeout(() => {
  console.log('callback 1');
}, 2000);

sleep(4000);

setTimeout(() => {
  console.log('callback 2');
}, 1000);

console.log('Finishing up');

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

//Its Output
Starting app
Finishing up
Callback 1
Callback 2
console.log('Starting app');
设置超时(()=>{
log('callback1');
}, 2000);
睡眠(4000);
设置超时(()=>{
log('callback2');
}, 1000);
console.log('Finishing up');
函数睡眠(毫秒){
var start=new Date().getTime();
对于(变量i=0;i<1e7;i++){
如果((新日期().getTime()-start)>毫秒){
打破
}
}
}
//其产出
启动应用程序
结束
回拨1
回拨2
例2:

console.log('Starting app');

setTimeout(() => {
  console.log('callback 1');
}, 2000);

sleep(4000);

setTimeout(() => {
  console.log('Callback 2');
}, 0);

console.log('Finishing up');

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

//Its Output
Starting app
Finishing up
Callback 2
Callback 1
console.log('Starting app');
设置超时(()=>{
log('callback1');
}, 2000);
睡眠(4000);
设置超时(()=>{
log('callback2');
}, 0);
console.log('Finishing up');
函数睡眠(毫秒){
var start=new Date().getTime();
对于(变量i=0;i<1e7;i++){
如果((新日期().getTime()-start)>毫秒){
打破
}
}
}
//其产出
启动应用程序
结束
回拨2
回拨1
我试图理解两个异步函数计时器开始同时或逐个执行。
示例1
工作正常,正如我预期的那样。首先到达队列中的回调1,因为它的超时时间为2秒。因为在回调2之前有4秒的延迟


示例2
此示例没有如我预期的那样工作。应首先在队列中到达回调1,因为它在回调2之前有2秒的超时和4秒的延迟。

似乎假设
sleep
函数的循环在超时之前不会完成,这可能是问题所在

console.log('Starting app');
睡眠(4000);
console.log('Finishing app');
函数睡眠(毫秒){
var start=new Date().getTime();
对于(变量i=0;i<1e7;i++){
如果((新日期().getTime()-start)>毫秒){
console.log('breaking');
打破
}
}
log(`Sleep time:${new Date().getTime()-start}ms`);

}
JavaScript是单线程的。当它忙于循环或创建其他计时器或记录“完成”时,它无法运行
回调1
。完成所有这些事情后,两个计时器都完成了,因此它们可以按任何顺序运行。您正在对文档中不支持的顺序进行一些假设。来自:“回调可能不会在精确的延迟毫秒内被调用。Node.js不保证调用的确切时间,也不保证调用的顺序。”顺序是未定义的,事实上,如果您在chrome控制台中运行第二个代码,它会在回调之前返回回调12@WilliamChong
s/you/I/;s/your/my/
;)就像你说的,它还没有定义。我在我的Chrome控制台中按照与OP相同的顺序获取它们。@paulpro@mark meyer@william chong
sleep
timer期望值是错误的,因此每个人看到的差异取决于他们的计算机执行循环的速度。