也许我只是不理解承诺,但我之前使用过这种模式,从来没有遇到过问题。在节点中使用bluebird。
我有这个被击中的功能:
function getStores() {
return new Bluebird((resolve, reject) => {
return Api.Util.findNearbyStores(Address,(stores) => {
if (!stores.result) {
console.log('one')
reject('no response');
console.log('two')
}
const status = stores.results.status
})
})
}
然后点击我的两个日志,继续经过if和throws
'one'
'two'
TypeError: Cannot read property 'Status' of undefined
基本上它一直走在决心之上。
我的印象是承诺应该立即在拒绝时短路并通过拒绝作为承诺的决议。我误解了这个吗?
答案 0 :(得分:1)
是的,你误解了这一点。 reject(…)
不是语法(就像resolve(…)
isn't either),并且不像退出函数的return
语句那样。这只是一个返回undefined
的普通函数调用。
您应该使用
if (!stores.result) reject(new Error('no response'));
else resolve(stores.results.status);
拒绝的“短路”行为归因于承诺链。当你有
getStores().then(…).then(…).catch(err => console.error(err));
然后拒绝getStores()
返回的承诺将立即拒绝链中的所有承诺并触发catch
处理程序,忽略传递给then
的回调。