需要从内部循环调用 angular http 服务并等待服务的值达到 return 然后再执行调用下面的代码
Need to call angular http service from inside loop and wait for the value of the service to return before executing code below call
有一个场景,我们有一个循环,在循环中我们需要调用一个 http
服务来获取循环中每个项目的信息。
然后根据服务调用,我们需要评估并做其他工作,然后继续处理循环中的每个元素。
我知道由于服务调用的同步性质以及服务调用本身就是一个承诺,这将无法按编码工作。
只是看看最好的 angular 方法来完成这个。过去我使用过 $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
}
});
请注意所有回复的人,在继续之前我需要 return 的服务,因为如果满足条件,我将显示一个模式。上面的代码是伪代码,我知道 .Then 在 getInfo 上丢失了,但你明白了。在查看循环中的下一项之前,每个循环都可能需要用户输入才能继续。
要访问承诺的结果,您可以使用 then()
:
_($scope.searchResult)
.each(function (results) {
myService.getInfo(results).then(function(response) {
var specialInfo = response.data;
if(specialInfo.length > 0) {
// Do something
}
else {
// Do something else
}
});
});
重构您的代码,使没有循环,但递归异步调用:
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
});
});
有一个场景,我们有一个循环,在循环中我们需要调用一个 http
服务来获取循环中每个项目的信息。
然后根据服务调用,我们需要评估并做其他工作,然后继续处理循环中的每个元素。
我知道由于服务调用的同步性质以及服务调用本身就是一个承诺,这将无法按编码工作。
只是看看最好的 angular 方法来完成这个。过去我使用过 $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
}
});
请注意所有回复的人,在继续之前我需要 return 的服务,因为如果满足条件,我将显示一个模式。上面的代码是伪代码,我知道 .Then 在 getInfo 上丢失了,但你明白了。在查看循环中的下一项之前,每个循环都可能需要用户输入才能继续。
要访问承诺的结果,您可以使用 then()
:
_($scope.searchResult)
.each(function (results) {
myService.getInfo(results).then(function(response) {
var specialInfo = response.data;
if(specialInfo.length > 0) {
// Do something
}
else {
// Do something else
}
});
});
重构您的代码,使没有循环,但递归异步调用:
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
});
});