此代码无法按预期工作:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function diff(expected) {
let x = expected - Date.now();
if (x > 0) {
return `earlier ${x} ms`;
} else if (x < 0) {
return `late ${-x} ms`;
} else {
return `just in time`;
}
}
start = Date.now();
async function demo() {
let loop_count = 5;
for (let i = 0; i < loop_count; i++) {
console.log(diff(start + i * 1000) + `: Waited ${i} seconds...`);
await sleep(i * 1000);
}
console.log(diff(start + loop_count * 1000) + ': Done');
}
demo();
输出是:
$ node test.js
just in time: Waited 0 seconds...
earlier 993 ms: Waited 1 seconds...
earlier 993 ms: Waited 2 seconds...
late 10 ms: Waited 3 seconds...
late 2011 ms: Waited 4 seconds...
late 5013 ms: Done
这种差异从何而来?
这种差异从何而来?
因为你测量不正确。首先你console.log(diff(start + i * 1000) + `: Waited ${i} seconds...`);
在await sleep(i * 1000);
. 此测试必须在sleep
.
另一个问题是您不会更改该start
值,并且您始终使用与start
每次迭代的参考相同的值。
所以在i>1
你得到错误的结果之后:你已经等了1
第二个,所以 for i=2
the total time elapsed from start
is (1 + 2)
seconds, for i=3
to total time elapsed from start
is (1 + 2 + 3)
seconds, ... 。
更新代码以使之前的睡眠时间也包含在计算中,从而得到预期的结果:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function diff(expected) {
let x = expected - Date.now();
if (x > 0) {
return `earlier ${x} ms`;
} else if (x < 0) {
return `late ${-x} ms`;
} else {
return `just in time`;
}
}
function sumUp(num) {
let res = 0;
for(let i=0; i<=num ; i++) {
res += i;
}
return res;
}
start = Date.now();
async function demo() {
let loop_count = 5;
for (let i = 0; i < loop_count; i++) {
await sleep(i * 1000);
console.log(diff(start + sumUp(i) * 1000) + `: Waited ${i} seconds...`);
}
console.log(diff(start + sumUp(loop_count) * 1000) + ': Done');
}
demo();
结果将始终是late
因为将至少setTimeout
等待给定的时间。对于您测量该错误的方式,每个调用的计时器都会堆积起来。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句