【问题标题】:Angular.JS multiple $http post: canceling if one failsAngular.JS 多个 $http 帖子:如果一个失败则取消
【发布时间】:2014-01-23 22:00:34
【问题描述】:

我是 Angular 的新手,想用它来将数据发送到我的应用程序的后端。在某些情况下,我必须进行几次 http post 调用,这些调用要么全部成功,要么全部失败。这是让我头疼的场景:给定两个 http post 调用,如果一个调用成功,而另一个调用失败怎么办?这将导致数据库中的不一致。如果至少一个呼叫失败,我想知道是否有办法取消后续呼叫。谢谢!

【问题讨论】:

    标签: ajax angularjs http


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      如果每个步骤都依赖于另一个步骤并导致数据库发生变化,那么最好在后端完成整个过程,由单个“POST”请求触发。我认为同步建模这个过程更容易,而且在服务器上比在客户端更容易。

      但是,如果您必须在客户端执行 post 请求,您可以将每个请求步骤定义为一个单独的函数,并通过 then(successCallback, errorCallback) 链接它们(此处的视频示例: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)
                                ...
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多