【问题标题】:How to roll back changes when there is an error in a promise chain当 Promise 链中出现错误时如何回滚更改
【发布时间】:2014-01-18 10:37:22
【问题描述】:

在我的 Angular 应用程序中,我想通过混合事务和设置来更改我的 Firebase 中的多个位置。我用a little help 写了一个承诺链。现在我需要处理可能发生的任何错误。

如果任何承诺发生错误,我想回滚在 firebase 中所做的任何更改(成功的承诺)并提醒用户注意失败。

当前代码如下

$scope.addNewPost = function() {
  var refPosts = new Firebase(FBURL).child('/posts').push();
  // Get tags into array for incrementing counters
  var tags = $scope.post.tags.split(', ');
  var allPromises = [];
  // Iterate through tags and set promises for transactions to increment tag count
  angular.forEach(tags, function(value, index){
    var dfd = $q.defer();
    var refTag = new Firebase(FBURL).child('/tags/' + value);
    refTag.transaction( function (current_value) {
      return current_value + 1;
    }, function(error, committed, snapshot) {
      if (committed) {
        dfd.resolve( snapshot );
      } else {
        dfd.reject( error );
      }
    });
    allPromises.push( dfd.promise );
  });

  // Add promise for setting the post data
  var dfd = $q.defer();
  refPosts.set( $scope.post, function (error) {
    if (error) {
      dfd.reject(error);
    } else {
      dfd.resolve('post recorded');
    }
  });
  allPromises.push( dfd.promise );

  $q.all( allPromises ).then(
    function () {
      $scope.reset(); // or redirect to post
    },
    function (error) {
      // error handling goes here how would I
      // roll back any data written to firebase
      alert('Error: something went wrong your post has not been created.');
    }
  );
};

所以我需要知道的是,如果其中一个承诺失败,我如何回滚我的 firebase 数据发生的任何更改。 firebase 中可能会发生任意数量的更新。 (例如:通过事务增加 3 个标签并设置发布数据)

我将如何编写失败函数来计算成功并撤消它?如果这是可能的。

----------------原帖子问题已解决---------------

你如何强制错误?我试过设置一个像下面这样的变量,但它似乎不起作用,我的 .then 有什么问题吗?

refPosts.set( $scope.post, function (error) {
  var forceError = true;
  if (forceError) {
    dfd.reject(forceError);
  } else {
    dfd.resolve('post recorded');
  }
  allPromises.push( dfd.promise );
});

【问题讨论】:

  • 我正在尝试做同样的事情(创建 angular-firebase 博客,带有可以过滤的文章标签)。你有没有想过这个问题?

标签: angularjs error-handling firebase promise angularfire


【解决方案1】:

这条线有两个实例,它们都在错误的地方:

allPromises.push( dfd.promise );
  • 在第一个块中,它应该在 forEach 回调的最后一条语句中,而不是在事务回调中。
  • 在第二个块中,应该在调用set()之后,而不是在回调中。

您的代码现在的编写方式,$q.all() 得到了一个空的 promise 数组。这也可能是干扰您尝试的 forceError 测试的原因。

【讨论】:

  • 感谢 Noa 允许我强制错误。这有点偏题,绝对是个问题,但这只是我要问的一部分。我正在编辑帖子以更清楚地定义问题。
猜你喜欢
  • 1970-01-01
  • 2018-01-18
  • 2010-11-12
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 2020-08-02
  • 2012-02-17
  • 1970-01-01
相关资源
最近更新 更多