You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:41:30