2016-06-27 4 views
1

У меня есть сервис API:Отменить отложенные вызовы API в Restangular

var SearchSuggestionApi = function (Restangular) { 

    return { 
    getSuggestion: function (keyword) { 
     return Restangular.one('search').customGET(null, {keyword:keyword}); 
    } 
    }; 

}; 

SearchSuggestionApi.$inject = [ 
    'Restangular' 
]; 

У меня есть контроллер для вызова этого API:

vm.getSuggestion = function (keyword) { 

    SearchSuggestionApi.getSuggestion(keyword) 
    .then(
     function (data) { 
     vm.listData = data; 
     }, function (error) { 
     console.log(error); 
     }); 
}; 

Моя проблема в том, когда я называю vm.getSuggestion(keyword) два или много времени (необходимо позвонить чем один раз). Такие, как:

vm.getSuggestion('a'); // => Return a array with many object in this vm.getSuggestion('a b');// => Return empty array

Поскольку vm.getSuggestion('a') возвратных много данных, он закончит после vm.getSuggestion('a b'). Таким образом, vm.listData - [{object1}, {object2}, ...], но я хочу vm.listData - [] (данные ответа последней функции).

Как отменить ожидающий вызов API в первой функции, когда я вызываю функцию секунд или другие способы получить последние данные ответа и установить для vm.listData.

Я исследовал некоторые статьи о cancel pending API calls, но это не помогает мне в моей проблеме.

Спасибо за вашу помощь :)

ответ

1

Существуют различные способы решения этой:

  • Вы можете просто проверить в вашем затем обратного вызова, является ли по-прежнему тока значение, полученное:

    vm.getSuggestion = function (keyword) { 
    
        SearchSuggestionApi.getSuggestion(keyword) 
        .then(
         function (data) { 
         if (vm.keyword === keyword) { 
          vm.listData = data; 
         } 
         }, function (error) { 
         console.log(error); 
         }); 
    }; 
    
  • Вы можете аннулировать запрос, указав адрес: timeout promise

  • Если вы часто решаете эту проблему, вы можете заменить обещание наблюдаемым потоком RxJS с соответствующими операторами. Это самое чистое решение, но требует дополнительной библиотеки.

+0

Я нашел решение - проверить 'vm.keyword === keyword', но я приму ваш ответ. Спасибо :) – WorkWe