await 常规函数 vs await async 函数,并且两个函数都返回 fulfilled promise [关闭]

问题描述 投票:0回答:0

如果我直接等待

Promise
,执行顺序似乎是合理的。
但是,如果我只是将它更改为
async
函数,即没有其他任何更改,顺序就会完全改变。
谁能解释一下发生在我身上的事?

看了一些资料,我想我明白了。

  1. 当await为特定值时,比如await 1,await undefined,await之后的代码会直接加入到微任务队列中
  2. 当await thenable(not promise) t时,会先把它的then函数加入到微任务队列中,then函数执行后,await之后的代码会加入到微任务队列中。请注意,由“then”函数解析的值将用作 await 表达式的返回值
  3. when await Promise,fulfilled后,将后续代码添加到微任务队列中。
  4. await 普通函数时,将其返回值处理为#1,#2,#3 案例 1 -> 直接等待 promise
  5. 当 await async 函数时,它有点复杂。
    A。如果它返回特定值,则处理为#1
    b.如果返回 thenable 值,处理为 #2.
    C。如果返回 promise,假设它被命名为 p,无论它是 fulfilled 还是 pending,async 函数在返回时总是将它包装在一个新的 pending promise p2 中。所以当异步函数返回时,首先将 p.then 添加到微任务队列中。当 p.then 执行时,如果 p 已完成,则将新任务“resolve-p2”添加到微任务队列。如果没有,则在 p 完成时将任务“resolve-p2”添加到微任务队列。 'resolve-p2'任务只用于解析p2,那么await之后的代码可以添加到微任务队列

// await Promise directly, the output will be
// "calling" 1 "resolved" 4 2 5 3 6
function f() {
  return new Promise(resolve => {
      resolve('resolved');
  });
}

async function test() {
  console.log('calling');
  const result = await f();
  console.log(result);
}
Promise.resolve()
    .then(() => console.log(1))
    .then(() => console.log(2))
    .then(() => console.log(3))

test();

Promise.resolve()
    .then(() => console.log(4))
    .then(() => console.log(5))
    .then(() => console.log(6))

case2 -> 改为异步函数

// "calling" 1 4 2 5 3 "resolved" 6
async function f() {
  return new Promise(resolve => {
      resolve('resolved');
  });
}

async function test() {
  console.log('calling');
  const result = await f();
  console.log(result);
}
// [then1] 'calling' [then1 p.then then4]
// 1 4 [then2 resolve-p2 then5]
// 2 5 [then3 then-resolved then6]
// 3 'resolved' 6
Promise.resolve()
    .then(() => console.log(1))
    .then(() => console.log(2))
    .then(() => console.log(3))
test();

Promise.resolve()
    .then(() => console.log(4))
    .then(() => console.log(5))
    .then(() => console.log(6))

async-await promise event-loop
© www.soinside.com 2019 - 2024. All rights reserved.