2016-06-27 34 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