未处理非关键Promise是否属于不良编程实践?
未等待异步辅助函数的常见疑问解答
问题场景示例
async function someFunction() { const result = await doSomething(); cacheResult(result); // 未使用await等待该异步函数 return result; } async function cacheResult(someValue) { // ... 包含异步逻辑的缓存操作,返回Promise }
1. someFunction是否会在cacheResult resolved前执行完毕?cacheResult后续会正常resolved吗?
会的。因为调用cacheResult时没有加await,someFunction不会等待这个异步操作完成,会直接执行到return result并结束。而cacheResult返回的Promise会在后台继续执行,只要其内部逻辑没有被中断,最终一定会在后续某个时间点完成resolved或rejected。
2. 外层try/catch包裹someFunction后,cacheResult的Promise拒绝会导致进程终止吗?
会的。外层的try/catch只负责捕获someFunction执行过程中抛出的错误,而cacheResult的Promise没有被任何代码await或者用.catch()捕获其拒绝状态。这种未处理的Promise拒绝在Node.js环境中会触发unhandledRejection事件,默认会终止进程;在浏览器中会触发控制台警告,属于需要避免的问题。
3. cacheResult已做错误处理且耗时较长,不等待它完成是否是有效实践?
这是有效且常用的性能优化手段,但必须满足两个前提:
- 缓存操作的结果完全不影响主业务流程(比如不影响
someFunction的返回值和后续逻辑) cacheResult内部已经做好了完整的错误捕获与处理,确保不会产生未被处理的Promise拒绝
比如可以在cacheResult内部处理所有错误:
async function cacheResult(someValue) { try { // ... 异步缓存逻辑,比如写入Redis、数据库等 } catch (error) { // 记录错误日志,或者执行降级处理,确保Promise不会被拒绝 console.error('缓存操作失败:', error); } }
这种情况下,让缓存操作在后台异步执行,主流程无需等待就能返回结果,能显著减少接口响应时间,是合理的设计方案。
内容的提问来源于stack exchange,提问作者Ceiling Gecko
相关产品推荐
相关产品推荐

