停止AngularJS承诺链

时间:2013-05-30 23:17:57

标签: javascript angularjs

我正在试图找出一个好方法来说“做所有这些事情,但在任何一个失败的情况下保释”

我现在拥有的:

var defer = $q.defer();

this
    .load( thingy ) // returns a promise

    .then( this.doSomethingA.bind( this ) )
    .then( this.doSomethingB.bind( this ) )
    .then( this.doSomethingC.bind( this ) )
    .then( this.doSomethingD.bind( this ) )

    .then( function(){
        defer.resolve( this );
    } );
    ;

return defer.promise;

我最终想要的是以某种方式捕获该链上的任何错误,以便我可以将其传递给上面的defer承诺。如果语法与我上面的语法保持相似,我并不特别在意。

即使有人可以告诉我如何阻止上述链条。

6 个答案:

答案 0 :(得分:6)

你可以通过在任何回调中返回被拒绝的promise来停止angularjs链。

load()
.then(doA)
.then(doB)
.then(doC)
.then(doD);

其中 doA doB doC doD 可以有如下逻辑:

var doA = function() {
    if(shouldFail) {
        return $q.reject();
    }
}

答案 1 :(得分:3)

我偶然发现了这一点,并意识到所有这些答案都非常过时。以下是为碰巧找到这篇文章的人处理此问题的正确方法。

// Older code
return this.load(thing)
  .then(this.doA, $q.reject)
  .then(this.doB, $q.reject)
  .then(this.doC, $q.reject)
  .then(this.doD, $q.reject)
  .then(null, $q.reject);


// Updated code
// Returns the final promise with the success handlers and a unified error handler
return this.load(thing)
  .then(this.doA)
  .then(this.doB)
  .then(this.doC)
  .then(this.doD)
  .catch(this.handleErrors); // Alternatively, this can be left off if you just need to reject the promise since the promise is already rejected.
  // `.catch` is an alias for `.then(null, this.handleErrors);`

答案 2 :(得分:2)

你应该可以通过以下方式做同样的事情:

var defer = $q.defer();

this
    .load( thingy ) // returns a promise

    .then( this.doSomethingA.bind( this ), $q.reject )
    .then( this.doSomethingB.bind( this ), $q.reject )
    .then( this.doSomethingC.bind( this ), $q.reject )
    .then( this.doSomethingD.bind( this ), $q.reject )

    .then( defer.resolve.bind( defer, this ), defer.reject.bind( defer ) );
    ;

return defer.promise;

答案 3 :(得分:0)

好的,这有效,但我不喜欢......等待更好的东西:)

为了立即拒绝它而创造一个承诺似乎很脏

myApp
    .factory( 'chainReject', [ '$q', function( $q ){
        return function( err ){
            var defer = $q.defer();
            defer.reject( err );

            return defer.promise;
        }
    } ] );

...

var defer = $q.defer();

this
    .load( thingy ) // returns a promise

    .then( this.doSomethingA.bind( this ), chainReject )
    .then( this.doSomethingB.bind( this ), chainReject )
    .then( this.doSomethingC.bind( this ), chainReject )
    .then( this.doSomethingD.bind( this ), chainReject )

    .then( defer.resolve.bind( defer, this ), defer.reject.bind( defer ) );
    ;

return defer.promise;

答案 4 :(得分:0)

看起来像这个用例has been anticipated并使用$ q.reject(reason)来解决

答案 5 :(得分:0)

处理此问题以及解决问题的最佳方法是.catch块。在你要杀死承诺链的任何.then块中,是的,使用:

 return $q.reject();

然而如此延伸......

 return $q.reject(new Error('Error Message Here'));

现在在catch方法中你会有这个

 .catch(function(err) {
     console.log(err); //This will log the above 'Error Message Here'
 });

现在我们在时尚承诺失败中正确地抛出并处理承诺错误。