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

Bluebird Promise调用reject后未短路问题求助

嘿,我来帮你理清这个问题的根由,以及怎么解决它:

问题出在哪?

  1. reject() 不会自动终止函数执行:它只是把Promise的状态改成了"拒绝",但函数里reject()之后的代码该跑还是会跑。所以你看到one和two都被打印,就是因为reject('no response')执行完后,后面的console.log('two')没有被中断。
  2. TypeError的来源:你判断的是!stores.result(单数),但后面又去访问stores.results.status(复数)。当stores.result不存在时,stores.results很大概率也是undefined,这时候去读取它的status属性,自然就会抛出Cannot read properties of undefined的错误。

怎么解决?

这里有两种靠谱的处理方式:

方式一:调用reject后立刻return

在reject()之后加个return,直接终止函数后续代码的执行,这样后面的代码就不会再跑了:

function getStores() { 
  return new Bluebird((resolve, reject) => { 
    return Api.Util.findNearbyStores(Address, (stores) => { 
      if (!stores.result) { 
        console.log('one');
        reject('no response');
        return; // 加上这行,直接终止后续代码
        console.log('two'); // 这行再也不会执行了
      } 
      const status = stores.results.status;
      // 这里可以继续处理成功逻辑,比如resolve(status)
    }) 
  }) 
}

方式二:用else包裹正常逻辑

把正常执行的代码放到else块里,这样当!stores.result的条件成立时,就不会进入else块执行后续代码:

function getStores() { 
  return new Bluebird((resolve, reject) => { 
    return Api.Util.findNearbyStores(Address, (stores) => { 
      if (!stores.result) { 
        console.log('one');
        reject('no response');
      } else {
        console.log('two'); // 只有条件不成立时才会打印
        const status = stores.results.status;
        // 处理成功逻辑,比如resolve(status)
      }
    }) 
  }) 
}

另外还有个小建议:你可以检查下stores.result和stores.results的拼写是不是统一的,会不会是手滑写错了单复数?这也可能导致你判断逻辑出现偏差哦。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:11:28