Bluebird Promise调用reject后未短路问题求助
嘿,我来帮你理清这个问题的根由,以及怎么解决它:
问题出在哪?
reject()不会自动终止函数执行:它只是把Promise的状态改成了"拒绝",但函数里reject()之后的代码该跑还是会跑。所以你看到one和two都被打印,就是因为reject('no response')执行完后,后面的console.log('two')没有被中断。- 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
相关产品推荐
相关产品推荐

