实现 sleep 函数

使用 Promise 和 setTimeout 实现异步延迟函数

问题

实现一个 sleep 函数,返回一个 Promise,在指定毫秒数后 Promise 变为完成状态。

export function sleep(ms: number): Promise<undefined> {
  // 补全此处代码
  throw new Error('功能待实现');
}

async function main() {
  console.log('a');
  await sleep(1000);
  console.log('b'); // 1秒后输出
}

解答

/**
 * @file 返回一个 Promise,并在 ms 毫秒后 Promise 变为完成状态
 */
export function sleep(ms: number): Promise<undefined> {
  return new Promise(
    (
      resolve: (value: undefined) => void,
      reject: (value: undefined) => void
    ) => {
      setTimeout(() => {
        resolve(undefined);
      }, ms);
    }
  );
}

使用示例:

async function main() {
  console.log('开始');
  await sleep(1000);
  console.log('1秒后执行');
  await sleep(2000);
  console.log('再过2秒执行');
}

main();

关键点

  • 返回一个新的 Promise 对象
  • 使用 setTimeout 在指定时间后调用 resolve
  • resolve 的参数为 undefined,符合函数返回类型
  • 配合 async/await 可以实现同步风格的异步延迟