
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 方法执行,那么其回调函数就应该先被放入微任务队列,也就应该先被执行,但实际情况不是这样。
另外,如果我把 async1 和 async2 的 async 关键字去掉,那么输出就变为
async1 end promise2 求大佬解答
1 Xu3Xan89YsA7oP64 2024-08-23 23:24:26 +08:00 async 函数本身还会将返回的内容包一层 promise ,你把 async2 的 async 去掉或者直接 return undefined 才是你要的效果 |
2 xiangyuecn 2024-08-23 23:37:55 +08:00 看起来是 async2 的 async 影响了 then 的执行,只需去掉 async2 的 async 就符合脑回路了,看不懂的代码一律当做玄学处理 |
3 moyuman OP @shizhibuyu2023 我知道了,确实是被隐式的包了一层 promise ,去掉 async 之后可以同等转换为 ```js function async2() { return Promise.resolve().then(() => { return new Promise((resolve, reject) => { resolve(); }); }) } ``` 这个时候其实最先被放入微任务队列的是 ```js return new Promise((resolve, reject) => { resolve(); }); ``` 然后是 promise2 这样就对了 |
4 moyuman OP reopen 一下,又查了一下相关文档,还是有疑问。 async 对返回值是用了 Promise.resolve 包了一层,而 Promise.resolve 在传入一个 promise 时,会原封不动的返回。 按照这个理论,async2 应该被转换为 function async2 () { return new Promise((resolve, reject) => { resolve(); }) } 但实际情况却不是 我想问的是,async 这个关键字到底做了何种转换?如果返回值是一个 promise ,其转换会有什么不同么?对执行顺序又有何影响? |