2016-06-27 57 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 ===關鍵字',但我會接受你的答案。非常感謝 :) – WorkWe