我正在试图找出一个好方法来说“做所有这些事情,但在任何一个失败的情况下保释”
我现在拥有的:
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
承诺。如果语法与我上面的语法保持相似,我并不特别在意。
即使有人可以告诉我如何阻止上述链条。
答案 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'
});
现在我们在时尚承诺失败中正确地抛出并处理承诺错误。