2015-03-19 2 views
4

У меня есть поле ввода. Когда в этом поле есть клавиатура, я отправляю запрос с помощью AJAX и $ http службы углового. Моя проблема в том, что когда запускается другое событие keyup, мне нужно отменить все ожидающие запросы. Я видел много ответов, но я не нашел решения.Как отменить ожидающие запросы в 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); 
}]); 

Это не очень хорошо работает.

И это:

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

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

Это отменить все запросы перед их отправкой.

Вы можете мне помочь?

+2

то, что вам нужно, это дребезг или дросселирование, в зависимости от того, что вы хотите достичь .. Infact нг покадрово-опции дают вам возможность дребезга, так что вы можете использовать это, а – harishr

+0

я не думаю, что ng-model имеют любые взаимодействия с h служба $ http и запросы Ajax, нет? –

+0

Я просто хотел указать, что в случае, если триггер для вызовов Ajax - это какое-то поле ввода пользователя, то вы можете использовать ng-model-options – harishr

ответ

2

Поскольку вы регистрируете завод, а не услугу, вам не нужно использовать «это», ваша функция не будет обрабатываться/создаваться как конструктор с новым ключевым словом.

вам нужна услуга, которая поддерживает компенсатор на каждом инициированном запросе и отменяет предыдущий запрос, если другой отправляются

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

Отлично, ваше первое объяснение хорошо работает! Спасибо –

Смежные вопросы