Javascript 处理失败的breezejs保存

Javascript 处理失败的breezejs保存,javascript,angularjs,breeze,promise,Javascript,Angularjs,Breeze,Promise,我有一个简单的angularjs服务,它包装了breeze,让我的应用程序可以使用它。在这个服务中,我希望有一个单一的机制来处理失败。我曾尝试在调用的末尾添加一个.fail(),如果breeze调用失败(例如,由于用户注销),则调用fail。唯一的问题是链中的第一个.done()也会被调用(通常位于调用服务的控制器中)。我只想在breeze成功的时候叫它 如何防止第一个完成的操作也被调用 下面是一个示例save调用(使用错误调用的done) 还有一个服务的片段 angular.module('a

我有一个简单的angularjs服务,它包装了breeze,让我的应用程序可以使用它。在这个服务中,我希望有一个单一的机制来处理失败。我曾尝试在调用的末尾添加一个.fail(),如果breeze调用失败(例如,由于用户注销),则调用fail。唯一的问题是链中的第一个.done()也会被调用(通常位于调用服务的控制器中)。我只想在breeze成功的时候叫它

如何防止第一个完成的操作也被调用

下面是一个示例save调用(使用错误调用的done)

还有一个服务的片段

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);    
        }
angular.module('app')
   .factory('dataStore' ,function() {

        function saveEntity(entity) {   
           return manager.saveChanges(entity);
        }
    });

实际上,我还没有看到任何例子,在你正在做的“then”之前,在承诺链上调用“fail”。因此,我会尝试将您的代码改写为:

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() {

        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);    
        }
angular.module('app')
   .factory('dataStore' ,function() {

        function saveEntity(entity) {   
           return manager.saveChanges(entity);
        }
    });

也许还有其他方法,但这似乎是最简单的

Jay的回答是我所想的方向,我不能100%确定如何使用Angular的绑定对象,但如果无法更改结构,另一种选择是向上传递状态对象以跟踪链中的故障条件(这个例子使用了一个击倒可观测的物体,因为我不太熟悉如何传递角度正在观测的物体,但一般的理论应该坚持下去)——


失败()在您的控制器中的“())操作之前应该被触发,当达到()时,它将知道链上出现了问题。

,证明了.For()进一步传播了这个承诺。

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()捕获错误,然后将承诺传递给第四个.then()。在我的示例中,breeze查询生成一个错误,该错误被.fail()捕获,然后处理该错误,并将承诺传递给调用容器中的.then()

要解决此问题,_handleFail()函数需要抛出一个错误,以防止调用任何chained.then()(直到该错误再次由.fail()处理)

所以我的服务现在看起来像:

角度。模块('app') .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);    
    }