-编辑-
我最近遇到了关于 promise 的怪异事物,但我想这可能是因为这违背了 promise 的哲学。
考虑以下代码:
// Assuming Auth is just a simple lib doing http requests with promises
Auth.signup()
.then(succCall, errCall)
.then(loginSucc, loginErr)
// My callbacks here
function succCall (){
// OK, send second promise
console.log('succCall');
return Auth.login();
}
function errCall(){
// I do some things here and now
// I want to break out from here
console.log('errCall');
}
function loginSucc(){
// This is the callback of the login method when it went OK
// I want to enter here ONLY if with go through the succCall
console.log('loginSucc');
}
function loginErr(){
// This is the callback of the login method when it went not ok
// I want to enter here ONLY if with go through the succCall
console.log('loginErr');
}
在这里,如果Auth.signup()出现问题,将显示以下内容:
如果我在errCall中执行$ q.reject(),则会发生以下情况:
这就是我想要的:
现在的问题是,当注册错误时它会进入errCall,这很好,但是随后进入loginSucc ...
当遇到任何errorCallback(此处为errCall或loginErr)时,我想打破then链。
-编辑-
我想我在某种程度上被误解了,如果出现问题,我想完全打破束缚而不检查任何其他“然后”。
好像我在说:如果先是然后是错误的在这里停止,如果先然后是可以继续,如果第二个“然后”可以继续,如果第三个“然后”错误,则停止
// Just like if i did the following but by chainning "then" methods
// My callbacks here
function succCall (){
// OK, send second promise
return Auth.login().then(loginSucc, loginErr);
}
我的意思是,如果我有很多“那么”链接,我就不希望只有一个错误处理程序
最佳答案
实际上正在发生的是:
try {
try {
var a = succCall();
} catch(e1) {
a = errCall(e1);
}
var b = loginSucc(a);
} catch(e2) {
b = loginErr(e2);
}
您可以通过致电打破链条
return $q.reject('Reason Err was called');
在您的
errCall()
函数中。编辑:
如OP通过调用
$q.reject
所述,该代码将进入loginErr
函数。或者,您可以像这样修改代码:
Auth.signup()
.then(function(a) {
succCall()
return loginSucc(a).then(null, loginErr);
}, errCall)
您可以在以下两个SO问题中了解更多信息:
这对阅读很有帮助:Flattening Promise Chains