JavaScript嵌套async/await用法疑问:如何打印resolved b及异步嵌套是否常见
问题解答
问题1:如何成功打印resolved b
你两次运行都没有输出resolved b,核心原因是从来没有对b()返回的Promise的resolve结果做打印处理:
- 第一段代码里
a()直接调用b(),没有等待也没有处理它的返回值,b()和a()内部的2s定时器并行执行,所以总耗时2s就输出了resolved a。 - 第二段代码你给
a()添加了await b()逻辑,会先等b()的2s定时器执行完resolve,再执行a()内部的2s定时器,两个异步操作串行所以总耗时4s,但依然没有处理b()的返回值,所以不会打印resolved b。
解决方法很简单,只要拿到b()的resolve结果后打印即可,参考修改后的a()代码:
async function a() { // 接收b()返回的resolve值 const bResult = await b(); // 打印值即可输出resolved b console.log(bResult); return new Promise((resolve, reject) => { setTimeout(() => { resolve('resolved a'); }, 2000); }); }
修改后运行输出顺序为:
"calling"
"calling b"
2秒后输出"resolved b"
再过2秒输出"resolved a"
完全符合你要求的a()内部先等b()执行完再走后续逻辑的需求。
问题2:该嵌套异步调用场景是否常见
这种场景非常常见,是async/await最典型的使用场景之一。实际业务开发中到处都是类似逻辑:比如你要调用获取用户信息的接口,需要先调用获取鉴权token的接口拿到凭证才能发请求,外层的页面初始化逻辑又要等用户信息返回之后才能渲染页面,和你现在的结构完全一致。
内容的提问来源于stack exchange,提问作者anishmanshr
相关产品推荐
相关产品推荐

