JavaScript 没有​​sleep()​​​开箱即用的功能。考虑到它运行的环境以及如果使用不当可能导致的问题,这可能是一个好主意。最接近的等价物是​​setTimeout()​​函数,但还有其他不太常见的方法来实现将暂停执行指定时间量的函数。

设置超时

JavaScript​​setTimeout()​​​设置了一个计时器,一旦计时器到期,它就会执行一些代码。只有​​setTimeout()​​回调中的代码会在计时器到期后执行。如果您不小心,这可能会导致嵌套问题以及乱序执行的代码。



const printNums = () => {
console.log(1);
setTimeout(() => console.log(2), 500);
console.log(3);
};

printNums(); // Logs: 1, 3, 2 (2 logs after 500ms)



同步版本

虽然强烈不鼓励,​​Date.prototype.getTime()​​​但可以在​​while​​​循环内使用以暂停执行一段时间。您可以像这样轻松定义同步​​sleep()​​函数:



const sleepSync = (ms) => {
const end = new Date().getTime() + ms;
while (new Date().getTime() < end) { /* do nothing */ }
}

const printNums = () => {
console.log(1);
sleepSync(500);
console.log(2);
console.log(3);
};

printNums(); // Logs: 1, 2, 3 (2 and 3 log after 500ms)



异步版本

实现​​sleep()​​​函数的一种不那么侵入性的方法是利用JavaScript ES6 中添加的​​async​​​and关键字,a和. 请注意,生成的函数必须在函数中执行,并且必须使用以下命令调用:​​await​​​​Promise​​​​setTimeout()​​​​async​​​​await​



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

const printNums = async() => {
console.log(1);
await sleep(500);
console.log(2);
console.log(3);
};

printNums(); // Logs: 1, 2, 3 (2 and 3 log after 500ms)