javascript - 如何取消 AngularJS 中的待处理请求?

标签 javascript ajax angularjs http

我有一个输入框。当这个字段上有一个 keyup 时,我发送一个带有 AJAX 和 $http 服务的请求。我的问题是当另一个 keyup 事件被触发时,我需要取消所有待处理的请求。我看了很多答案,但我没有找到解决方案。

我尝试了两件事:

我调用的服务

App.factory('findArticlesService', function($http, $q) {
   var self = this;
   self.canceller = null;

   return {
       getArticles: function(route, formData) {
           if (self.canceller) {
               self.canceler.resolve("Other request is pending");
           }

           var deferred = $q.defer();
           self.canceller = $q.defer();

           $http.post(route, angular.toJson(formData), {timeout: self.canceller.promise}).success(function(data) {
                deferred.resolve({data: data}); 
           });

           return deferred.promise;
       }
   };
});

App.controller('mainCtrl', ['$scope', '$http', '$q', 'findArticlesService', function($scope, $http, $q, findArticlesService) {
    var res = findArticlesService.getArticles(route, $scope.formData);
    console.log(res);
}]);

效果不佳。

还有这个:

var canceller = $q.defer();
canceller.resolve();

$http.post(route, angular.toJson($scope.formData), {timeout: canceller.promise}).then(function(data) {...});

这会在发送之前取消所有请求。

你能帮帮我吗?

最佳答案

由于您注册的是工厂而不是服务,因此您不必使用“this”,您的函数将不会被视为/实例化为带有 new 关键字的构造函数。

你需要一个服务来为每个发起的请求维护一个取消器,并在发送另一个请求时取消之前的请求

App.factory('findArticlesService', function($http, $q) {
  var canceller;

   return {
       getArticles: function(route, formData) {
           if (canceller) {
               canceller.resolve("Other request is pending");
           }
           canceller = $q.defer();

           return $http.post(route, angular.toJson(formData), {timeout: canceller.promise});

       }
   };
});

您甚至不需要中间取消器,可以使用与取消器相同的先前请求

App.factory('findArticlesService', function($http) {
  var canceler,
      getArticles = function (route, formData) {
        if (canceler) {
          canceler.resolve('aborted');
        }
        canceler = $http.post(route, angular.toJson(formData), {timeout: canceler.promise});
        return canceler;
      };

  return {
   getArticles: getArticles
 };
});

关于javascript - 如何取消 AngularJS 中的待处理请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29141423/

相关文章:

javascript - javascript ajax 无法正常工作

Angularjs ui-router 阻止访问非状态路由

javascript - AngularJS : Scope not shared across directives

javascript - 使用 jquery 删除 td 类

javascript - 如何在移动浏览器的视口(viewport)宽度和高度上将元素居中?

javascript - 我如何知道变量是否是私有(private)的?

javascript - 使用ajax在while循环中更新MySql数据库记录 - 仅更新第一行

javascript - 使用 (treeCut.src = "images/treeCut.png";) 更改 img 的 src

php - 热衷于使用ajax动态添加行?

javascript - 使用 karma 测试 angularjs 时初始化 Controller 时出错