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
shizhibuyu2023 89 天前 1
async 函数本身还会将返回的内容包一层 promise ,你把 async2 的 async 去掉或者直接 return undefined 才是你要的效果
|
2
xiangyuecn 89 天前
看起来是 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 ,其转换会有什么不同么?对执行顺序又有何影响? |