如何避免Promise.race()因未确认状态提前resolve?
解决方案
问题核心是statusCheck在收到unconfirmed状态时会默认resolve(返回undefined),导致Promise.race提前终止。要实现忽略unconfirmed、继续等待监听的需求,只需要让statusCheck在遇到unconfirmed时保持pending状态即可。
修改后的代码如下:
public async myFunction() { const successListener = rxjs.firstValueFrom(transactionConfirmationObservable) .then(result => { return result; // 监听交易状态变为"confirmed" }); const failureListener = rxjs.firstValueFrom(transactionFailureObservable) .then(result => { throw new Error(result); // 监听交易状态变为"failed" }); const statusCheck = axios(currentTransacionStatusRequest) .then(result => { if (result === "confirmed") return result; if (result === "failed") throw new Error(result); // 遇到unconfirmed时,返回一个永远pending的Promise,让statusCheck不触发race结束 return new Promise(() => {}); }); return Promise.race([successListener, failureListener, statusCheck]); }
关键修改点
- 当
statusCheck返回unconfirmed时,不再让Promise默认resolve,而是返回一个永远处于pending状态的Promise(new Promise(() => {}))。这样Promise.race会忽略这个未完成的Promise,继续等待successListener或failureListener触发。 - 把判断条件改成严格相等
===,避免因类型不匹配导致的逻辑错误。 - 移除了不必要的
async关键字(因为回调里没有await操作,不影响逻辑)。
这样就能严格实现你的需求:
- 状态为
confirmed时,statusCheck或successListener会resolve,函数返回结果 - 状态为
failed时,statusCheck或failureListener会reject,函数抛出错误 - 状态为
unconfirmed时,statusCheck保持pending,函数继续等待监听事件触发
内容的提问来源于stack exchange,提问作者Domantas Jūras
相关产品推荐
相关产品推荐

