我使用AngularJS和Elasticsearch构建了一个小型搜索应用程序(电影)。在测试中,我意识到我忘记了在事情花费的时间超过计划时添加超时,但是我无法让它工作。我实际上决定使用$ interval而不是$ timeout,因为它似乎更好,因为它仍然可以获得结果,而不是在需要更长时间时停止进程。
这是我的代码:
vm.search = function() {
vm.currentPage = 1;
vm.results.documents = [];
vm.isSearching = true;
$state.go('search');
return searchService.search(vm.searchTerms, vm.currentPage).then(function(es_return) {
var totalItems = es_return.hits.total;
var totalTime = es_return.took;
var numPages = Math.ceil(es_return.hits.total / vm.itemsPerPage);
vm.results.pagination = [];
for (var i = 1; i <= 100; i++) {
vm.results.totalItems = totalItems;
vm.results.queryTime = totalTime;
vm.results.pagination = searchService.formatResults(es_return.hits.hits);//load all results
vm.results.documents = vm.results.pagination.slice(vm.currentPage, vm.itemsPerPage);
}
vm.noResults = true;
}
),
function(error){
console.log('ERROR: ', error.message);
vm.isSearching = false;
}
};
我正在试图找出放在哪里
if(totalItems > 0) {
$interval(function(){
vm.isSearching = true;
}, 2000);
在那里。
我已经尝试将它放入for循环但没有快乐:(
答案 0 :(得分:0)
您可以进一步链接承诺并从$q
生成延迟(TypeScript:$ q:IQService)并在一定时间后拒绝它并显示拒绝消息。
var defer = $q.defer();
并在某处返回defer.promise
SearchService.$inject = ["$q", "$http"]
function SearchService($q, $http) {
var defaultWaitUntilTimeout = 2000;
this.search = function (param, param2, waitUntilTimeout) {
var defer = $q.defer();
$http().get().then(function (result) { defer.resolve(result);})
$timeout(function () { defer.reject();}, waitUntilTimeout || defaultWaitUntilTimeout); // now the rejection function of the promise will get called
return defer.promise;
}
}
我希望你明白这个想法