让JavaScript函数暂停一段时间

原文:Make a JavaScript Function Sleep

JavaScript没有内置的sleep()函数,但也可以通过其他方式让函数暂停一段时间。

许多语言有sleep()函数,JavaScript却没有暂停执行一段时间的内置函数。主要原因是:在C一类的语言中,sleep(2)阻塞当前线程2秒钟,而JavaScript是单线程的,C风格的sleep(2)会阻塞整个JavaScript运行时2秒钟,是非常不实用的。

但是,在异步函数中,可以不阻塞JavaScript运行时,暂停一段时间。只需要await一个一段时间后resolve的Promise即可。

1
2
3
4
5
6
7
8
9
10
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

async function run() {
// 该异步函数暂停执行2秒钟
await sleep(2000);

console.log('已经暂停了2秒');
}

new Promise()构造器创建了一个新的ms毫秒后resolve的Promise。当await这个Promise时,就能暂停执行当前函数,不影响其他函数。

例如,可以在两个函数中并行调用sleep(),二者互相不会阻塞。

1
2
3
4
5
6
7
8
9
10
11
const start = Date.now();

async function pauseMe() {
await sleep(2000);
console.log('毫秒数:', Date.now() - start);
}

// 打印 "毫秒数:2006"
pauseMe();
// 打印 "毫秒数:2010"
pauseMe();