在 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 可观察流。这是最干净的解决方案,但确实需要额外的库。
我有 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
.
我研究了一些关于 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 可观察流。这是最干净的解决方案,但确实需要额外的库。