在Promise中嵌套async函数的写法是否正确?是否属于反模式?
哥们儿,你的实现确实属于没必要的反模式,这里有更简洁的最佳实践
首先得明确一个核心点:async函数本身就会自动返回一个Promise,所以你完全没必要在function B里手动用new Promise去包裹内部的异步逻辑。你当前的写法属于「Promise套Promise」的冗余嵌套,不仅平白增加了代码复杂度,还容易踩坑(比如要是function C里的异常没被正确捕获,外层手动创建的Promise可能会一直卡成pending状态)。
为啥你的写法是反模式?
- 你在function B里手动new了一个Promise,但内部的function C本身就是async函数,它执行后会自动生成并返回一个Promise。这种嵌套完全是多此一举。
- 手动管理resolve/reject很容易出错,比如不小心忘了调用resolve,就会导致后续逻辑一直挂着;而async/await会自动帮你处理Promise的状态转换,省心多了。
优化后的正确写法
咱们直接把function B改成async函数就行,它天然就会返回Promise,内部还能直接用await处理异步操作,代码瞬间清爽很多:
const functionA = async () => { try { await functionB(); console.log(' ALL DONE '); } catch (err) { console.error(err); } } const functionB = async () => { const var1 = await make_databaseCall(); const var2 = await make_different_DatabaseCall(); if (!var2) throw new Error('var2 is invalid!'); const what_I_need = var1 + var2; // 要是不需要返回值,这里可以不用写return,async函数会默认返回一个resolved的空Promise };
额外小 tips
- 要是function B需要把
what_I_need传给function A,只需要在function B里加一句return what_I_need;,然后在function A里用const result = await functionB();就能拿到这个值。 - 用
try/catch包裹await操作,比直接在后面链式加.catch()更符合async/await的代码风格,尤其是当有多个异步操作时,能统一处理所有异常,结构更清晰。
这样改完,既满足了让function A等待function B所有异步操作完成的需求,又完全贴合async/await的最佳实践,再也没有冗余的嵌套逻辑啦~
内容的提问来源于stack exchange,提问作者Badrush
相关产品推荐
相关产品推荐

