javascript“await”是否会立即暂停它正在执行的操作并在承诺解决后恢复异步功能?

Aun*_*ant 1 javascript async-await

刚开始学习async-await,只是想清楚地了解程序执行流程。

async function A() {
 await doSomethingAsync();
 doThisNext();
}

A();
B();
C();
Run Code Online (Sandbox Code Playgroud)

鉴于上面的代码片段,假设 B() 目前正在执行。

  1. 当 B() 正在执行并且如果 doSomethingAsync() 在那一刻得到解决时,程序执行是否会暂时挂起 B() 以恢复 A() (即;启动 doThisNext() 然后切换回来?

  2. 还是会先完成 B()(甚至 C())然后执行 doThisNext()?

  3. 还是我误解了整件事?

假设 B 和 C 只是没有异步代码的通用函数。

Yur*_*nko 6

当 B() 正在执行并且如果 doSomethingAsync() 在那一刻得到解决时,程序执行是否会暂时挂起 B() 以恢复 A() (即;启动 doThisNext() 然后切换回来?

这不是事件循环的工作方式。如果B是同步的,它不会被承诺解析中断。计划在当前承诺解析微队列期间执行。

所以,订单将是

  1. A 开始和暂停
  2. B 结束
  3. C 结束
  4. 一个恢复和结束

A();
B();
C();



async function A() {
  console.log('A start');
  await delay(0);
  // or even
  // await Promise.resolve('done')
  console.log('A end')
}

function B() {
  console.log('B')
}

function C() {
  console.log('C')
}

function delay(ms) {
  return new Promise(r => setTimeout(r, ms))
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我错了,请纠正我,但我怀疑这对于 OP 来说可能也是一个有用的说明,可以将示例的行为与我们在执行其他示例之前等待 A() 的版本进行比较:https://jsfiddle.net/7kc68sj1 /。我认为这有助于表明等待暂停当前上下文并停止在该上下文中执行任何进一步的代码,直到承诺解决/拒绝。所以不同之处在于,在我的示例中,必须先执行整个 A()(包括等待延迟完成),然后才能运行 B。 (2认同)