-编辑-

我最近遇到了关于 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()出现问题,将显示以下内容:
  • err call ,登录成功

  • 如果我在errCall中执行$ q.reject(),则会发生以下情况:
  • errCall,loginErr

  • 这就是我想要的:
  • errCall ...完成,在此处停止

  • 现在的问题是,当注册错误时它会进入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问题中了解更多信息:
  • Break promise chain
  • Break Out of then promises inAngularjs

  • 这对阅读很有帮助:Flattening Promise Chains

    07-24 18:42