Javascript 如何在AngularJS中取消挂起的请求?

Javascript 如何在AngularJS中取消挂起的请求?,javascript,ajax,angularjs,http,Javascript,Ajax,Angularjs,Http,我有一个输入字段。当这个字段上有一个keyup时,我使用AJAX和angular的$http服务发送一个请求。我的问题是,当触发另一个keyup事件时,我需要取消所有挂起的请求。我看到了很多答案,但我没有找到解决办法 我尝试了两件事: 我称之为服务 App.factory('findArticlesService', function($http, $q) { var self = this; self.canceller = null; return { ge

我有一个输入字段。当这个字段上有一个keyup时,我使用AJAX和angular的$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
 };
});

您需要的是去抖动或节流,这取决于您想要实现的目标。。事实上,ng模式选项为您提供了去Bounce选项,因此您也可以使用它。我认为ng模型与$http服务和Ajax请求没有任何交互,不是吗?我只是想指出,如果Ajax调用的触发器是某个用户输入字段,那么您可以使用ng模式选项,或者使用谴责或限制,基于您的场景,以doc(v1.3.3)的形式进行非即时(取消公告)模型更新非常好,您的第一个解释非常有效!谢谢:D