我有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
是[]
(最后一个函数的响应数据)。
当我调用秒函数或获取最后一个响应数据并设置为的其他方法时,如何取消第一个函数中的未决API调用vm.listData
。
我研究了一些有关的文章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);
});
};
您可以通过指定超时承诺来取消请求
如果您经常解决此问题,则可能希望使用适当的运算符将RxJS可观察流替换为Promise。这是最干净的解决方案,但确实需要其他库。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句