有时候我们需要一定的延迟,来模拟高消耗 / 高耗时的操作,比如网络请求,有多种方式可以实现。

  1. 利用时间戳
function sleepSync(ttl) {
  const now = Date.now();
  ttl *= 1000;
  while (Date.now() - now < ttl) {}
}
sleepSync(2);
// TODO...

这个方案性能开销很大,会频繁触发 Date.now() - now < ttl 判断,CPU 压力大。优点就是代码侵入低,不会影响其他代码的逻辑和位置,后期不需要延迟的话直接删掉 sleepSync(2) 即可。

  1. 使用 Promise,异步风格
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
// 等待两秒
sleep(2000).then(() => {
  // TODO...
});

这个方案不会出现性能问题,但是如果后期不需要这个延迟,就需要把 then 回调函数中的代码挪出来。

  1. async/await
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
(async () => {
  await sleep(2000); // 等待两秒
  // TODO...
})();

这个方案有个缺点,如果使用 sleep 的地方,不是 async 函数,需要在函数前面加上 async 关键词,这会影响原函数的返回。