一个 Promise/async/await 的执行顺序问题求助🙏

28 天前
 moyuman
async function async1() {
  async2().then(() => {
    console.log('async1 end');
  });
}
async function async2() {
  return new Promise((resolve, reject) => {
    resolve();
  })
}

async1();
new Promise(function(resolve) {
  resolve();
}).then(function() {
  console.log('promise2');
})

输出结果为

promise2
async1 end

(面试时候遇到的,去掉了无关的 log)

想知道为什么 promise2 早于 async1 end ?

我的想法是 async2() 的 then 方法早于 new Promise 的 then 方法执行,那么其回调函数就应该先被放入微任务队列,也就应该先被执行,但实际情况不是这样。

另外,如果我把 async1async2async 关键字去掉,那么输出就变为

async1 end
promise2

求大佬解答

863 次点击
所在节点    问与答
4 条回复
shizhibuyu2023
28 天前
async 函数本身还会将返回的内容包一层 promise ,你把 async2 的 async 去掉或者直接 return undefined 才是你要的效果
xiangyuecn
28 天前
看起来是 async2 的 async 影响了 then 的执行,只需去掉 async2 的 async 就符合脑回路了,看不懂的代码一律当做玄学处理😂
moyuman
28 天前
@shizhibuyu2023 我知道了,确实是被隐式的包了一层 promise ,去掉 async 之后可以同等转换为
```js
function async2() {
return Promise.resolve().then(() => {
return new Promise((resolve, reject) => {
resolve();
});
})
}
```
这个时候其实最先被放入微任务队列的是
```js
return new Promise((resolve, reject) => {
resolve();
});
```
然后是 promise2
这样就对了
moyuman
23 天前
reopen 一下,又查了一下相关文档,还是有疑问。

async 对返回值是用了 Promise.resolve 包了一层,而 Promise.resolve 在传入一个 promise 时,会原封不动的返回。

按照这个理论,async2 应该被转换为
function async2 () {
return new Promise((resolve, reject) => {
resolve();
})
}
但实际情况却不是
我想问的是,async 这个关键字到底做了何种转换?如果返回值是一个 promise ,其转换会有什么不同么?对执行顺序又有何影响?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1067374

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX