Angular.JS多个$ http帖子:如果一个失败则取消

时间:2014-01-23 22:00:35

标签: ajax angularjs http

我是角色新手,想用它将数据发送到我应用的后端。在几个场合,我必须做几个http post调用,要么全部成功,要么全部失败。这种情况让我头疼:给两个http post调用,如果一个调用成功,但另一个调用失败怎么办?这将导致数据库中的不一致。我想知道如果至少有一个呼叫失败,是否有办法取消后续呼叫。谢谢!

2 个答案:

答案 0 :(得分:0)

在不了解您的具体情况的情况下,如果您还没有这样做,我会建议您使用promise错误处理。只有一种情况我知道你可以通过使用$ http中的超时选项取消已发送的承诺(查看this SO帖子),但你绝对可以防止将来的请求。进行$ http调用时会发生什么,它会返回一个promise对象(查看$ q here)。这样做会返回两个方法,你可以链接到你的$ http请求,称为成功和失败,所以它看起来像$ http.success({... stuff ...})。error({...更多的东西。 })。因此,如果您在每个场景中都有错误处理,并且得到.error,请不要进行下一次调用。

答案 1 :(得分:0)

您可以取消链中的下一个请求,但之前的请求已经发送。您需要提供必要的后端功能来反转它们。

如果每个步骤都依赖于另一个步骤并导致数据库发生更改,那么在后端执行整个过程可能会更好,由单个“POST”请求触发。我认为同步建模这个过程更容易,这在服务器中比在客户端更容易。

但是,如果您必须在客户端执行发布请求,则可以将每个请求步骤定义为单独的函数,并通过then(successCallback, errorCallback)链接它们(此处为Nice视频示例:https://egghead.io/lessons/angularjs-chained-promises)。

在您的情况下,您可以在每个步骤中使用then的错误回调检查前一个步骤是否未通过采取操作来撤消它:

var firstStep = function(initialData){
  return $http.post('/some/url', data).then(function(dataFromServer){
    // Do something with the data
    return {
      dataNeededByNextStep: processedData,
      dataNeededToReverseThisStep: moreData
    }
  });
};
var secondStep = function(dataFromPreviousStep){
  return $http.post('/some/other/url', data).then(function(dataFromServer){
    // Do something with the data
    return {
      dataNeededByNextStep: processedData,
      dataNeededToReverseThisStep: moreData
    }
  }, function(){
    // On error
    reversePreviousStep(dataFromPreviousStep.dataNeededToReverseThisStep);
  });
};
var thirdFunction = function(){ ... };

...

firstFunction(initialData).then(secondFunction)
                          .then(thirdFunction)
                          ...

如果链中的任何步骤失败,它的承诺将失败,并且不会执行后续步骤。