我创建了一个函数来理解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(),使其正常工作。
有谁可以解释这里发生的事情?
答案 0 :(得分:1)
这里发生的事情是,每次调用setTimeout之前,你的代码都会在while循环中停留1秒钟,这就是你得到3秒延迟的原因。
答案 1 :(得分:0)
编辑(我不知道为什么我认为你在sleep(1000)
之后睡了console.log
):
你确定它输出正确吗?当我运行它时,它会生成预期值:
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)
因为console.log
,我们在iterate(i)
和setTimeout
延迟的2秒之间有1秒的延迟。这似乎是正确的。