有时候我们需要一定的延迟,来模拟高消耗/高耗时的操作,比如网络请求,有多种方式可以实现。
- 利用时间戳
javascript
function sleepSync(ttl) {
const now = Date.now();
ttl *= 1000;
while (Date.now() - now < ttl) {}
}
sleepSync(2);
// TODO...
这个方案性能开销很大,会频繁触发Date.now() - now < ttl
判断,CPU 压力大。优点就是代码侵入低,不会影响其他代码的逻辑和位置,后期不需要延迟的话直接删掉 sleepSync(2)
即可。
- 使用 Promise,异步风格
javascript
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
// 等待两秒
sleep(2000).then(() => {
// TODO...
});
这个方案不会出现性能问题,但是如果后期不需要这个延迟,就需要把then
回调函数中的代码挪出来。
- async/await
javascript
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
(async () => {
await sleep(2000); // 等待两秒
// TODO...
})();
这个方案有个缺点,如果使用sleep
的地方,不是async
函数,需要在函数前面加上async
关键词,这会影响原函数的返回。