繁体   English   中英

Node js的回调队列排序

[英]Callback queue ordering of 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 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

范例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

我试图了解两个异步函数计时器开始同时开始执行或一个接一个地执行。
Example 1如我预期的那样工作正常。 回调1首先到达队列,因为它的超时时间为2秒。 因为在回调2之前有4秒的延迟。

Example 2此示例无法正常工作。 应该先在队列中到达回调1,因为它的超时为2秒,延迟为回调2前的4秒。

似乎假设sleep功能的循环在超时可能成为问题之前不会完成。

 console.log('Starting app'); sleep(4000); console.log('Finishing app'); function sleep(milliseconds) { var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) > milliseconds){ console.log('breaking'); break; } } console.log(`Sleep time: ${new Date().getTime() - start}ms`); } 

循环完成的时间取决于运行的计算机,但是大多数现代计算机永远都不会中断,因为它完成的时间比分配的时间快。 这会产生一定范围的“睡眠”时间,这可能导致在不同的机器上获得不同的输出(如果增量足够小,则两次运行之间同一台机器上的输出也会不同)。

例如,在我的一台机器上,此代码需要花费约800毫秒(750毫秒至830毫秒的范围)来完成。 比指定的4000ms短得多。

因此,在第一个测试示例中,代码将在我的计算机上按以下方式运行:

  • 设置2000ms的超时时间以输出“回调1”
  • 循环约800毫秒(不需要4000毫秒)
  • 设置输出“回调2”的超时时间为1000ms

这导致“回调2”在约1800ms处打印,而“回调1”在约2000ms处打印。 考虑到它们之间的距离,我敢冒险您正在使用的机器执行该循环要慢一些,因此您可以按照指示的方式观察它。

在第二个测试示例中,代码将在我的计算机上这样执行:

  • 设置2000ms的超时时间以输出“回调1”
  • 循环约800毫秒(不需要4000毫秒)
  • 将超时时间设置为0ms,以输出“回调2”

这导致“回调2”在约800毫秒处打印,而“回调1”在约2000毫秒处打印。 由于您的计算机速度足够快,可以在4秒内完成循环,因此您现在可以观察到问题中指出的“意外”输出。

因此,基本上,您用来“睡眠”的循环并没有提供您基于期望的等待时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM