2015-03-19 62 views
4

我有一个输入栏。当在这个字段上有一个关键字时,我发送一个带有AJAX和角度$ http服务的请求。我的问题是当另一个键盘事件触发时,我需要取消所有未决的请求。我看到很多答案,但我还没有找到解决方案。如何取消AngularJS中的待处理请求?

我想两件事情:

,我称之为

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); 
}]); 

它不工作所需要的服务。

这:

​​

该取消所有的请求在发送之前。

你能帮我吗?

+2

你需要的是反跳,或节流,这取决于你想要达到.. INFACT NG-模式选项为您提供的反跳选项是什么,这样你就可以使用,以及 – harishr 2015-03-19 11:18:22

+0

我不认为ng-model有任何相互作用h $ http服务和Ajax请求,不是吗? – 2015-03-19 15:43:19

+0

我只想指出,如果Ajax调用的触发器是某个用户输入字段,那么您可以使用ng-model-options – harishr 2015-03-19 15:56:46

回答

2

由于您注册的是工厂而不是服务,所以您不必使用“this”,您的函数将不会被视为/ instanciated作为构造函数,并带有新关键字。

你需要保持对每个发起请求消除和取消,如果另一发送

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 
}; 
}); 
+0

太棒了,你的第一个解释很好!感谢:D – 2015-03-23 08:54:54