在同一个异步功能/定时器复位中使用多个setTimeout

时间:2017-12-11 11:26:18

标签: javascript node.js async-await

当试图理解async / await时,我尝试了这段代码,它没有像我预期的那样表现。

let test = async function () {
  let result = new Promise((resolve, reject) => {
    setTimeout(() => resolve('done1'), 2000)
  })

  let result2 = new Promise((resolve, reject) => {

    setTimeout(() => resolve('done2'), 2500)
  })

  let x1 = await result
  console.log(x1)


  let x2 = await result2
  console.log(x2)

}

test()

我希望控制台在2秒后显示done1,然后在done1后2.5秒显示done2。相反,它在2秒内显示done1并在此之后0.5秒内完成。为什么它会像这样,因为我在显示第一个之后等待第二个setTimeout?

1 个答案:

答案 0 :(得分:1)

当您创建new Promise时,它会开始运行它的代码。当你在里面有setTimeout时,实际上计时器正在运行。在await电话会议之前使用Promise时,它会一直等到承诺得到解决或拒绝后再开始工作。

您需要创建每个承诺,然后等待它。



let test = async function () {

  let result = new Promise((resolve, reject) => {
    setTimeout(() => resolve('done1'), 2000);
  });
  
  let x1 = await result;
  console.log(x1);

  let result2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve('done2'), 2500);
  });

  let x2 = await result2;
  console.log(x2);

}

test()