使用async/await实现一个sleep函数和asyncSum函数

902 阅读1分钟

实现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输出一个数
总结
  1. 借用await需要等待Promise状态变化的特点,同时结合setTimeout做停顿。
  2. 具体就是setTimeout的回调函数内部做resolveawait等到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}`)
})
总结
  1. 利用await后跟Promise内含setTimeout,在其中resolve,由于await见到resolve才做后续操作,所以成功实现了sleep机制。
  2. 加法就是用resolve(sum)把前一次加法结果传回给result,进而实现累加。

感受

在一次面试基础部分遇到类似的问题,后来发现这是一道经典的面试题,据说字节也问过。拿来写写,加强对async/await的理解。