2016-06-27 1 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) 2または多くの時間を呼び出すとき(呼び出す必要があります1回よりも)。以下のような:

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[](最後の機能の応答データ)です。

seconds関数を呼び出すか、最後の応答データを取得する別の方法を呼び出してvm.listDataに設定すると、最初の関数で保留中のAPI呼び出しをキャンセルする方法を教えてください。

私は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

関連する問題