我有一个简单的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);
}
答案 0 :(得分:3)
事实证明.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);
}
答案 1 :(得分:0)
我还没有看到任何“失败”的例子。在'然后'之前在承诺链上被调用。这就是你在做什么。所以我会尝试重写你的代码看起来像:
function handleFail(error) {
if (error && error.status && error.status === 401) {
// Logged out error (for example
}
};
dataStore.saveEntity(model)
.then(function() {
// your success code here. - should not get called except on success.
}).fail(handleFail);
包裹微风的服务片段
angular.module('app')
.factory('dataStore' ,function() {
function saveEntity(entity) {
return manager.saveChanges(entity);
}
});
也可能有其他方式,但这似乎最简单。
答案 2 :(得分:0)
var status = ko.observable(true);
// var $scope.status = true (maybe???)
dataStore.saveEntity(model)
.then(function() {
if (status()) { // status still equals true, no failures occurred, carry on
}
});
angular.module('app')
.factory('dataStore' ,function() {
var _handleFail = function(error) {
if (error && error.status && error.status === 401) {
// Logged out error (for example)
status(false);
}
};
function saveEntity(entity) {
return manager.saveChanges(entity).fail(_handleFail);
}
fail()应该在你的控制器中then()之前触发,当到达then()逻辑时,它会知道链上有问题。