处理失败的breezejs保存

时间:2013-09-17 20:46:01

标签: javascript angularjs breeze promise

我有一个简单的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);    
        }

3 个答案:

答案 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)

杰伊的回答是我的想法,我不是100%确定如何用Angular的绑定对象做到这一点,但另一个选择,如果你不能改变结构,是传递一个状态对象来跟踪链中的失败条件(该示例使用Knockout observable,因为我不熟悉如何传递Angular正在观察的对象,但一般理论应该坚持) -

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()逻辑时,它会知道链上有问题。