我有一个简单的angularjs服务,它包含微风,使其可用于我的应用程序.在这项服务中,我希望有一种处理失败的机制.我试图在调用结束时将.fail()置于链接中,如果breeze调用失败(例如由于用户被注销),则调用失败.唯一的问题是链中的第一个.done()(通常驻留在调用服务的控制器中)也会被调用.我只希望在微风成功时调用它.
如何防止第一次完成被调用?
以下是一个示例保存调用(完成时调用错误)
dataStore.saveEntity(model)
.then(function() {
// This is being called on fail
});
还有一小撮服务包裹着微风
angular.module('app')
.factory('dataStore' ,function() {
var _handleFail = function(error) {
if (error && error.status && error.status === 401) {
// Logged out error (for example
}
};
function saveEntity(entity) {
return manager.saveChanges(entity).fail(_handleFail);
}
解决方法:
事实证明.fail()进一步传播了promise.考虑以下:
promise.then(function(){
console.log('Then 1');
throw new Error('Error');
})
.then(function(){
console.log('Then 2');
})
.then(function(){
console.log('Then 3');
})
.fail(function(){
console.log('Fail 1');
})
.then(function(){
console.log('Then 4');
});
将输出:
> Then 1
> Fail 1
> Then 4
.fail()从第一个.then()中捕获错误,然后将promise传递给第四个.then().在我的例子中,breeze查询生成一个由.fail()捕获的错误,处理完毕后,promise将被传递给调用容器中的.then().
为了解决这个问题,_handleFail()函数需要抛出一个错误来防止任何链接的.then()被调用(直到错误由.fail()处理.
所以我的服务现在看起来像:
angular.module( ‘应用程序’)
.factory(‘dataStore’,function(){
var _handleFail = function(error) {
if (error && error.status && error.status === 401) {
// Logged out error (for example
throw new Error('Unauthorized');
}
};
function saveEntity(entity) {
return manager.saveChanges(entity).fail(_handleFail);
}