在 JavaScript 中等待 Promise 时到底会发生什么?

rb6*_*612 5 javascript promise async-await

我似乎可以在文档或相关资源中的任何地方找到一点,那就是当 JS 命中关键字时,关于调用函数和事件循环的过程是什么await

\n\n

这里\xe2\x80\x99s 的规格说明如下:

\n\n
\n

\xc2\xa0await 表达式会导致异步函数执行暂停,直到 \xc2\xa0a Promise 得到解决(即被履行或被拒绝),并在履行后恢复异步函数的执行。恢复时,await\xc2\xa0 表达式的值是已完成的\xc2\xa0Promise 的值。

\n
\n\n

这一切都有道理,但是暂停到底是什么意思呢?该函数是否立即返回给调用者,然后当正在等待的\xe2\x80\x99s 的承诺解决时,它和异步方法的其余部分会被添加到微任务队列中进行处理吗?我知道这async/await是 Promise API 的语法糖,所以我\xe2\x80\x99m 假设这就是发生的情况,但我想确保我\xe2\x80\x99m 真正理解\xe2\x80\x9cmagic\ xe2\x80\x9d 当await达到an 时发生。

\n\n

从我读到的内容来看,这似乎是 xe2x80x99 在 C# 中所做的,但我不太确定它如何转换为 JS。

\n

fel*_*osh 7

正如你所说,它将其余功能放入微任务中,并继续主功能。

然后,当承诺解决时,它会将该任务排队,以便执行异步部分。

帮助我理解它的是将 async/await 转换为 Promise 语法,然后就清楚了。

例如:

async function doSomthing() {
  someSync();

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

  return result1 + result2;
}
Run Code Online (Sandbox Code Playgroud)

“转换”为:

function doSomthing() {
  someSync();

  return someAsync().then(result1 => {
    return someAsync2().then(result2 => {
      return result1 + result2;
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

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