等待JavaScript中的承诺时会发生什么?

时间:2019-05-27 10:03:24

标签: javascript promise async-await

在JS点击await关键字时,关于调用函数和事件循环的过程似乎是我在文档或相关资源中找不到的地方。

specs状态如下:

  

await表达式会导致异步函数执行暂停,直到Promise被解决或被拒绝为止,并在实现后恢复执行异步函数。恢复后,等待表达式的值即为已兑现承诺的值。

这一切都说得通,但是暂停到底意味着什么?函数会立即返回给调用者,然后在等待的诺言得到解决时,将其和其余异步方法添加到微任务队列中进行处理吗?我知道async/await是Promise API的语法糖,所以我假设这是会发生的事情,但是我想确保自己真正理解了{{1 }} 到达了。

从我读到的内容来看,这似乎是用C#完成的,但是我不确定它如何转换为JS。

2 个答案:

答案 0 :(得分:4)

正如您所说的那样,它将其余功能放入微任务Q中,并返回主要功能。

然后,当承诺解决时,它将执行异步部分。

帮助我理解它的是将async / await转换为promise语法,然后它变得清晰起来。

例如:

async function doSomthing() {
  someSync();

  const result1 = await someAsync();
  const result2 = await someAsync2();

  return result1 + result2;
}

“转换”为:

function doSomthing() {
  someSync();

  return someAsync().then(result1 => {
    return someAsync2().then(result2 => {
      return result1 + result2;
    });
  });
}

您可以看到doSomthing立即返回了承诺。

答案 1 :(得分:0)

等待/异步表示我们同步执行代码。它将遵循async函数内调用await函数的顺序。 例如:它将像等待它一样逐行处理执行,然后从await返回响应,然后继续执行。

 `function doubleAfter2Seconds(x) {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve(x * 2);
      }, 2000);
    });
  }

  async function addAsync(x) {
     console.log("Here I am before first await"); 
    const a = await doubleAfter2Seconds(10);
    console.log("A ouput is ",a);
    const b = await doubleAfter2Seconds(20);
    console.log("B ouput is ",b);
    const c = await doubleAfter2Seconds(30);
    console.log("C ouput is ",c);
    return x + a + b + c;
  }


  addAsync(10).then((sum) => {
    console.log(sum);
  });`

上面的代码将输出如下结果:

enter image description here

希望这有助于了解异步/等待状态