Skip to content

如何在JavaScript中实现一个sleep函数?

JavaScript 没有内置的sleep函数,这可能是一个好主意,考虑到如果使用不当可能会引起很多麻烦。最接近的等效方法是使用setTimeout()函数,但还有其他不太常见的方法来实现一个可以暂停执行一段指定时间的函数。

使用setTimeout()

JavaScript的setTimeout()设置一个定时器,在定时器到期后执行一些代码。只有setTimeout()回调内部的代码会在定时器到期后执行。这可能会导致嵌套问题,以及如果不小心的话代码执行顺序混乱。

const delay = (fn, ms, ...args) => setTimeout(fn, ms, ...args);

const greet = (name) => console.log(`Hello ${name}!`);
delay(greet, 300, 'world');
// 输出: Hello world! (300毫秒后)

使用promise实现异步版本

另一种实现sleep()函数的方法是利用asyncawait关键字、PromisesetTimeout()。请注意,结果函数本身是异步的。

const sleep = (ms) =>
  new Promise(resolve => setTimeout(resolve, ms));

const greet = async () => {
  console.log('我马上就会和你在一起。');
  await sleep(300);
  console.log('你好!');
};
greet();
// 输出: 我马上就会和你在一起。
// 输出: 你好! (300毫秒后)

[!NOTE]

本文的原始版本展示了一个使用Date.prototype.getTime()的同步版本的函数。由于这种做法被强烈不推荐,并且可能导致各种问题,因此已被移除。