Node.js中async函数返回Promise状态显示差异疑问
问题原因结论
这个差异确实是Node.js(底层依赖的V8 JavaScript引擎)版本迭代带来的行为变化,非代码逻辑错误。
具体原理解释
- 非async的
a函数直接返回已决议的Promise.resolve('a'),所以同步打印永远是已决议状态Promise { 'a' } - async函数
c返回普通字符串'c',按照async函数的规范要求,普通返回值会直接被包装为已决议的Promise,所以同步打印永远是已决议状态Promise { 'c' } - 核心差异来自async函数
b的处理:b返回的是另一个已决议的Promise实例- 旧版本Node.js(<12.x,对应V8版本低于7.6):遵循早期ECMAScript规范的要求,async函数的返回值如果是Promise类型,外层async返回的Promise需要异步等待内层Promise的决议,这个等待过程会放到微任务队列执行,所以同步执行
console.log(b())时,外层Promise还未完成决议,就会显示Promise { <pending> } - 新版本Node.js(>=12.x,对应V8版本7.6+):V8引擎引入了async函数返回Promise场景的快速路径优化,当返回的Promise已经是已决议状态时,外层async返回的Promise会直接同步完成决议,不需要走微任务等待流程,所以同步打印就能直接看到已决议的值
Promise { 'b' }
- 旧版本Node.js(<12.x,对应V8版本低于7.6):遵循早期ECMAScript规范的要求,async函数的返回值如果是Promise类型,外层async返回的Promise需要异步等待内层Promise的决议,这个等待过程会放到微任务队列执行,所以同步执行
补充说明
这个差异仅影响同步打印Promise状态时的展示效果,不会影响实际运行逻辑:无论哪个版本,调用b().then(res => console.log(res))拿到的结果都是'b',功能完全兼容。
内容的提问来源于stack exchange,提问作者user1424739
相关产品推荐
相关产品推荐

