为什么 Javascript 不“等待”等待正确的时间?

陶瓷

此代码无法按预期工作:

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

这种差异从何而来?

t.niese

这种差异从何而来?

因为你测量不正确。首先你console.log(diff(start + i * 1000) + `: Waited ${i} seconds...`);await sleep(i * 1000);. 此测试必须在sleep.

另一个问题是您不会更改该start值,并且您始终使用与start每次迭代的参考相同的值。

所以在i>1你得到错误的结果之后:你已经等了1第二个,所以 for i=2the total time elapsed from startis (1 + 2)seconds, for i=3to total time elapsed from startis (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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的异步/等待功能异常?(Javascript)

来自分类Dev

为什么Javascript函数不等待onclick就执行?

来自分类Linux

为什么不waitpid等待进程退出?

来自分类Dev

为什么异步/等待不异步运行?

来自分类Dev

为什么setInterval不等待指定的时间?

来自分类Dev

为什么“等待”不等待?

来自分类Dev

为什么等待不等待?

来自分类Dev

JavaScript异步/等待未正确等待?

来自分类Dev

为什么std :: future :: wait_for不等待正确的持续时间?

来自分类Dev

为什么Prolog等待

来自分类Dev

Javascript 异步/等待时间

来自分类Dev

为什么函数 Javascript 不执行?

来自分类Dev

睡在javascript中,为什么不循环?

来自分类Dev

为什么不触发 JavaScript Promise Catch

来自分类Javascript

为什么不执行此JavaScript代码?

来自分类Dev

为什么我的javaScript函数不触发?

来自分类Dev

为什么不运行Javascript代码?

来自分类Dev

为什么Javascript转换时间不同?

来自分类Dev

为什么 UIAlertController 在等待回答时不暂停代码?

来自分类Dev

为什么等待条件释放锁但信号不释放?

来自分类Dev

为什么不'await'等待axios请求完成?

来自分类Dev

为什么异步方法不立即返回等待状态?

来自分类Dev

为什么我的 setTimeout 函数没有等待指定的时间?

来自分类Dev

为什么要花这么长时间处理异步等待

来自分类Dev

为什么我的网站有很长的 TTFB 等待时间?

来自分类Dev

为什么“等待”不等待独立工作

来自分类Dev

为什么异步等待不等待 - nodejs

来自分类Dev

为什么在这种情况下Javascript异步等待不起作用?

来自分类Dev

为什么等待一个空的 JavaScript Promise 不会让运行时保持活动状态?

Related 相关文章

热门标签

归档