繁体   English   中英

在递归setTimeout函数中使用sleep

[英]Using sleep inside recursive setTimeout function

我创建了一个函数来了解JavaScript中setTimeout()函数的行为。 我创建了一个递归函数,不断调用自身。 直到我在其中添加了睡眠功能,它都可以正常工作。 这是代码。

'use strict';

(function iterate(i) {
  var t=setTimeout(function () {
    console.log('timeout ' + i + ' ' + (new Date()));
    sleep(1000);
    console.log('timeout ' + i + ' ' + (new Date()));
    //clearTimeout(t);
    iterate(++i);
  },2000);
})(0);

function sleep(millis) {
  console.log('sleeping...');
  var date = new Date();
  var curDate = null;
  do {
    curDate = new Date();
  }
  while (curDate - date < millis);
}

这是我运行此代码时的输出。

timeout 0 Wed May 13 2015 12:07:21 GMT+0530 (IST)
sleeping...
timeout 0 Wed May 13 2015 12:07:22 GMT+0530 (IST)
timeout 1 Wed May 13 2015 12:07:25 GMT+0530 (IST)
sleeping...
timeout 1 Wed May 13 2015 12:07:26 GMT+0530 (IST)
timeout 2 Wed May 13 2015 12:07:29 GMT+0530 (IST)
sleeping...
timeout 2 Wed May 13 2015 12:07:30 GMT+0530 (IST)

两次迭代调用之间的时间差应为2秒,但始终为sleep_time + delay_time,在这种情况下为3秒。 另外在调用iterate()之前添加clearTimeout()使其正常工作。

谁能解释这里发生了什么?

发生的情况是,每次调用setTimeout之前,您的代码每次都会在while循环中停留1秒钟,这就是为什么要延迟3秒的原因。

编辑(我不知道为什么我假设您在两个console.log之后都进入sleep(1000) ):

您确定输出正确吗? 当我运行它时,它会生成期望值:

timeout 0 Wed May 13 2015 09:16:16 GMT+0200 (Środkowoeuropejski czas letni)
VM631:15 sleeping...
VM631:8 timeout 0 Wed May 13 2015 09:16:17 GMT+0200 (Środkowoeuropejski czas letni)
VM631:6 timeout 1 Wed May 13 2015 09:16:19 GMT+0200 (Środkowoeuropejski czas letni)
VM631:15 sleeping...
VM631:8 timeout 1 Wed May 13 2015 09:16:20 GMT+0200 (Środkowoeuropejski czas letni)
VM631:6 timeout 2 Wed May 13 2015 09:16:22 GMT+0200 (Środkowoeuropejski czas letni)
VM631:15 sleeping...
VM631:8 timeout 2 Wed May 13 2015 09:16:23 GMT+0200 (Środkowoeuropejski czas letni)
VM631:6 timeout 3 Wed May 13 2015 09:16:25 GMT+0200 (Środkowoeuropejski czas letni)
VM631:15 sleeping...
VM631:8 timeout 3 Wed May 13 2015 09:16:26 GMT+0200 (Środkowoeuropejski czas letni)
VM631:6 timeout 4 Wed May 13 2015 09:16:28 GMT+0200 (Środkowoeuropejski czas letni)

因此,由于setTimeout导致console.log与2秒钟iterate(i)延迟之间存在1秒钟的延迟。 这似乎是正确的。

暂无
暂无

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

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