我有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
的文章,但它对我的问题没有帮助。
感谢您的帮助:)
答案 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。这是最干净的解决方案,但需要额外的库。