async函数中两种请求链式写法是否等效?
Async函数里请求链式调用的两种写法对比
结论先行
这两种写法都完全可行,而且执行逻辑、最终结果甚至错误处理都是一模一样的——都是先等待request1执行完成,再启动request2,等request2结束后才会继续执行后续代码。
底层逻辑拆解
不管用哪种写法,本质都是利用Promise的链式调用特性:
- 连续
await写法:
const someFunct = async () => { await request1(); await request2(); // ...后续代码 }
await request1()会暂停async函数的执行,直到request1返回的Promise变成resolved状态,之后才会执行await request2(),同样要等它完成才往下走。
await结合.then()写法:
const someFunct = async () => { await request1() .then(() => request2()); // ...后续代码 }
request1().then(() => request2())会生成一个新的Promise:这个Promise会先等request1完成,再触发request2,只有当request2也完成后,整个链式Promise才会resolved。外层的await就是在等这个完整的链式Promise结束,和连续await的效果完全一致。
额外提醒
- 错误处理:两种写法的错误捕获逻辑也一致——如果
request1或request2抛出错误,都可以用try/catch包裹整个await代码块来捕获。 - 可读性:连续
await的写法更符合async/await“像写同步代码一样写异步逻辑”的设计初衷,读起来更直观;而.then()链式写法是传统Promise的风格,在async函数里没必要刻意混用,除非你需要在.then()里快速做一些同步逻辑(但这种场景用连续await也能轻松实现)。
内容的提问来源于stack exchange,提问作者Natsuo
相关产品推荐
相关产品推荐

