实现sleep函数
目标
- js中没有sleep机制,使用
async/await实现一个sleep机制。
功能
- 每隔固定的时间输出一次数据。
function sleep(interval) {
return new Promise(resolve => {
setTimeout(() => {
resolve()
}, interval);
})
}
// 用法
async function countInAsync() {
for(let i = 1; i <= 5; i++) {
await sleep(1000);
console.log(i);
}
}
countInAsync(); // 1 2 3 4 5 隔1s输出一个数
总结
- 借用
await需要等待Promise状态变化的特点,同时结合setTimeout做停顿。 - 具体就是
setTimeout的回调函数内部做resolve,await等到resolved才执行下一次循环中的await操作。
实现asyncSum函数 (或 asyncAdd函数)
目标
- 使用
async/await实现一个asyncSum函数
功能
- 随机个数的参数做加法,从左到右两两相加,每隔1s做一次加法输出。
async function asyncSum(...rest) {
let result = rest.shift();
for(let num of rest) {
result = await new Promise(resolve => {
setTimeout(function () {
let sum = num + result;
resolve(sum)
console.log(sum)
}, 1000)
})
}
return result
}
asyncSum(1, 2, 3, 4).then(res => {
console.log(`计算结果为: ${res}`)
})
总结
- 利用
await后跟Promise内含setTimeout,在其中resolve,由于await见到resolve才做后续操作,所以成功实现了sleep机制。 - 加法就是用
resolve(sum)把前一次加法结果传回给result,进而实现累加。
感受
在一次面试基础部分遇到类似的问题,后来发现这是一道经典的面试题,据说字节也问过。拿来写写,加强对async/await的理解。