在 Restangular 中取消挂起的 API 个调用

Cancel pending API calls in Restangular

我有 API 服务:

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')return数据较多,vm.getSuggestion('a b')后完成。所以vm.listData就是[{object1}, {object2}, ...],但是我想vm.listData就是[](最后一个函数的响应数据)。

当我调用秒函数或其他获取最后响应数据并设置为 vm.listData.

的方法时,如何取消第一个函数中挂起的 API 调用

我研究了一些关于 cancel pending API calls 的文章,但它对我的问题没有帮助。

感谢您的帮助:)

有多种解决方法:

  • 您可以简单地检查您的 then 回调是否收到的值仍然是最新的:

    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 可观察流。这是最干净的解决方案,但确实需要额外的库。