async/await只是then 的语法糖吗?有什么细微上的不同吗?为什么这两段代码输出不一致?
首先是async/await
风格的promise
我理解的流程:
- 进入
async1()
, 在其内部调用async2()
async2()
内部没有异步代码,所以执行后会回到await
处, 然后将下面的代码console.log('async1 end')
注册在微任务队列里async1()
流程结束- 进入
Promise()
, 执行resolve()
, 执行then()
注册微任务 - 同步代码结束,执行微任务队列的回调函数
- 依次执行
console.log('async1 end')
,console.log('promise2')
async function async1() {
await async2();
console.log('async1 end');
}
async function async2() {
return new Promise(resolve => {
console.log('async2 promise');
resolve(32);
// 这里的同步代码结束后流程会回到调用async2处
// 然后把下边的 console.log('async1 end') 注册为 微任务吧?
})
}
async1();
new Promise(resolve => {
resolve();
}).then(() => {
console.log('promise2');
})
// 以下是结果
// async2 promise
// promise2
// async1 end
下面这个是我所认为的逻辑上相同的then
的写法
function async1() {
async2().then(() => {
console.log('async1 end');
})
}
function async2() {
return new Promise(resolve => {
console.log('async2 promise');
resolve(32);
})
}
async1();
new Promise(resolve => {
resolve();
}).then(() => {
console.log('promise2');
})
// async2 promise
// async1 end
// promise2
为了方便比较,我放在了一张图片里
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你忽略了一个问题async function本身就是一个返回Promise,不同版本的node对async2的这种情况处理不太一致。
以typescript playground作为标的,转换后的写法应该是:
async/await = Generator + Promise
为什么这两段代码输出不一致?
async1
转成Promise
格式后相当于相当于:题主顺便再看看
resolve
函数的执行逻辑就知道原因了