JavaScript:将Promise.then写法转为async/await并处理promise-retry失败
promise-retry 配合 async/await 处理全量重试失败的实现方案
核心逻辑对齐说明
首先需要明确:promiseRetry 返回的是符合 Promises/A+ 规范的标准 Promise 对象,其错误传播行为和原生 Promise 完全一致。当所有重试次数耗尽时,promiseRetry 会将返回的 Promise 置为 reject 状态,抛出最后一次捕获的执行错误。
你之前看到的 .then(成功回调, 失败回调) 双参数写法,和 async/await 场景下的错误处理不存在本质差异,不存在“写在then第二参数的错误回调无法被await捕获”的情况。
等价实现方式
直接使用 try/catch 块包裹对 promiseRetry 的 await 调用,即可1:1复现原双参数then的错误处理分支:
let resp; try { // 这部分对应原.then的第一个参数(成功回调) resp = await promiseRetry((retry, number) => doSomething().catch(retry)); // 拿到返回值后的成功逻辑写在这里 console.log('重试成功,业务返回值:', resp); } catch (err) { // 这部分对应原.then的第二个参数(失败回调) // 触发条件:达到最大重试次数后仍然执行失败 console.log('全量重试耗尽,最终错误信息:', err); }
与原有写法的特性对齐提醒
需要注意原双参数then写法和链式独立catch的固有差异,避免换用await后行为错位:
- 原
.then(onSuccess, onError)结构中的onError回调,仅会捕获 promiseRetry 本身抛出的reject错误,不会捕获 onSuccess 回调内部抛出的异常 - 这种捕获边界和try/catch块的逻辑是天然对齐的:await拿到返回值后,如果你在try块内、拿到resp之后写的业务逻辑抛出异常,同样会被同一个catch块捕获
- 如果要完全和原逻辑保持一致,只需要将这部分后续业务逻辑移到await之后,按需单独做错误处理即可,不需要改变全量重试失败的捕获逻辑
比如要完全对齐原代码的行为,可以参考如下结构:
try { const resp = await promiseRetry((retry, number) => doSomething().catch(retry)); // 把原来在onSuccess里写的、不希望被重试错误catch捕获的逻辑挪到此处执行 handleSuccessBusinessLogic(resp); } catch (retryFinalErr) { // 这里仅处理全量重试失败的场景 handleRetryFailLogic(retryFinalErr); }
内容的提问来源于stack exchange,提问作者AngularDebutant
相关产品推荐
相关产品推荐

