JavaScript中,将async函数包裹在Promise内是否有实际用途?
关于冗余Promise套async/await模式的分析
你完全没有忽略任何关键点——这种把async/await包裹在手动创建的Promise构造函数里的写法是纯粹的冗余反模式,没有任何实际作用,反而会引发严重的错误处理问题。
原模式的核心问题
原代码中,promiseFunc本身就是一个async函数,调用后会自动返回一个Promise,但它被不必要地塞进了new Promise((resolve) => { ... })中。更致命的是:
- 外层Promise只定义了
resolve回调,没有处理reject逻辑 - 当
await model.save()抛出错误时,promiseFunc返回的Promise会被reject,但这个reject状态无法传递到外层手动创建的Promise中,直接变成未处理的Promise拒绝——这正是你们现在bug频发、错误难以排查的根源。
你给出的两种优化写法的合理性
你提供的两种写法都是原模式的等价简化,且更优:
1. async/await写法(推荐)
/** * Update Data Model * @param {Object} model * @param {String} field * @param {Mixed} value */ async function updateDataModel(model, field, value) { model[field] = value; await model.save(); return model; } module.exports = updateDataModel;
这种写法最简洁易读,且天然支持错误捕获:调用方只需通过try/catch(在async函数中)或.catch()(在Promise链中)就能捕获model.save()抛出的所有错误。
2. .then()链式写法
/** * Update Data Model * @param {Object} model * @param {String} field * @param {Mixed} value */ function updateDataModel(model, field, value) { model[field] = value; // 可简化,model.save()本身会返回保存后的实例 return model.save(); } module.exports = updateDataModel;
这种写法同样等价于原模式,但可读性略逊于async/await,同样支持通过.catch()捕获错误。
优化建议
- 立即将所有此类冗余代码替换为你提供的第一种
async/await写法,统一团队编码规范 - 检查所有调用该函数的代码,确保都添加了错误处理逻辑(
try/catch或.catch()),彻底解决未处理Promise拒绝的问题 - 团队内部明确禁止这种手动Promise套async函数的无意义写法,避免后续再出现类似问题
内容的提问来源于stack exchange,提问作者George Beckert
相关产品推荐
相关产品推荐

