我们有一个循环,在循环内部我们需要调用http
服务来获取循环中每个项目的信息。
然后根据服务调用的结果我们需要评估并做其他工作然后继续循环中的每个元素。我明白,由于服务调用的同步特性以及服务调用本身就是一个承诺,这将无法按编码工作。
只需查看最佳角度方式即可实现此目的。在过去,我使用过 $q.all
,但我必须使用 $q.all
制作多个循环。
_($scope.searchResult)
.each(function (results) {
var specialInfo = myService.getInfo(results); // http service call
if(specialInfo.length > 0){
// Do something
}
else
{
// Do something else
}
});
请注意响应的任何人我需要在继续之前返回服务,因为如果满足条件,我将显示模态。上面的代码是伪代码,我知道。然后getInfo上缺少了。但是你明白了。在查看循环中的下一个项目之前,每个循环都可能需要用户输入才能继续。
答案 0 :(得分:1)
重构你的代码,这样就没有循环,而是递归的异步调用:
var currentIndex = 0;
function processNext() {
if (currentIndex >= $scope.searchResult.length) {
return;
}
var next = $scope.searchResult[currentIndex++];
myService.getInfo(next).then(function (response) {
var specialInfo = response.data;
if (specialInfo.length > 0) {
// something
} else {
// something else
}
processNext();
});
}
processNext();
或者,您可以先获取所有承诺,然后一次处理一个承诺。请记住,如果对响应进行异步处理(例如等待模态输入或执行后续请求),则不建议使用此方法 :
var promises = $scope.searchResult.map(function (result) {
return myService.getInfo(result);
});
$q.all(promises).then(function (responses) {
responses.each(function (response) {
// do stuff
});
});
答案 1 :(得分:0)
要访问承诺的结果,请使用Uncaught TypeError: Cannot read property 'setAttribute' of undefined
:
then()