JavaScript是单线程的,基于宿主环境的其他线程实现异步。
异步带来的好处很多,耗时操作大都放在异步队列中处理。那么在异步下如何去封装一个睡眠函数呢?
promise
使用限制:必须配合async await去使用
function delay(sm = 1000) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, sm);
});
}
(async () => {
console.time("delay");
await delay(1000);
console.timeEnd("delay");
})();
// 控制台输出
// delay: 1.014s
while循环
可以直接在主线程中使用,在主线程慎用。
function sleep(sm) {
const nowTime = new Date();
while (Date.now() - nowTime < sm) {
continue;
}
}
console.time("sleep");
sleep(2000);
console.timeEnd("sleep");
// 控制台输出
// sleep: 2.000s
也可以在异步中使用
console.time("main");
setTimeout(() => {
console.time("sleep");
sleep(2000);
console.timeEnd("sleep");
}, 0);
console.timeEnd("main");
// 控制台输出
// main: 0.599ms
// sleep: 2.000s