[英]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短得多。
因此,在第一个测试示例中,代码将在我的计算机上按以下方式运行:
这导致“回调2”在约1800ms处打印,而“回调1”在约2000ms处打印。 考虑到它们之间的距离,我敢冒险您正在使用的机器执行该循环要慢一些,因此您可以按照指示的方式观察它。
在第二个测试示例中,代码将在我的计算机上这样执行:
这导致“回调2”在约800毫秒处打印,而“回调1”在约2000毫秒处打印。 由于您的计算机速度足够快,可以在4秒内完成循环,因此您现在可以观察到问题中指出的“意外”输出。
因此,基本上,您用来“睡眠”的循环并没有提供您基于期望的等待时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.