在Restangular

时间:2016-06-27 08:20:35

标签: javascript angularjs api promise 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')会返回许多数据,因此会在vm.getSuggestion('a b')之后完成。所以vm.listData[{object1}, {object2}, ...],但我希望vm.listData[](最后一个函数的响应数据)。

当我调用秒函数或其他方式获取最后一个响应数据并设置为vm.listData时,如何在第一个函数中取消挂起的API调用。

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

感谢您的帮助:)

1 个答案:

答案 0 :(得分: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可观察流替换promise。这是最干净的解决方案,但需要额外的库。