我试图使用$ q服务在迭代中暂停,因为我有循环进行API调用的条件。
我使用了以下方法:
function getData(id){
var deferred = $q.defer();
var data;
Restangular.all("some/api").post(id)
.then(function (result) {
data = result;
doSomeFurtheProcessingWithData(data);
console.log("Data fetched for "+id);
deferred.resolve(data);
}, function(error) {
deferred.resolve(data);
});
return deferred.promise;
}
function getDataOneByOne(ids){
for(var i=0;i<ids.length;i++){
console.log("Fetching details for "+ ids[i]);
getData(ids[i]);
}
}
我希望结果是
获取101的详细信息
获取101的数据
获取102的详细信息
提取102的数据
提取103的详细信息
提取103的数据
但是上面代码给出的实际结果是
获取101的详细信息
获取102的详细信息
获取 103的详细信息
提取101的数据
提取的数据 102
已获取103的数据
答案 0 :(得分:1)
您可以尝试使用await / async在遍历循环之前等待promise返回吗?像下面一样
function getData(id){
var deferred = $q.defer();
var data;
Restangular.all("some/api").post(id)
.then(function (result) {
data = result;
doSomeFurtheProcessingWithData(data);
console.log("Data fetched for "+id);
deferred.resolve(data);
}, function(error) {
deferred.resolve(data);
});
return deferred.promise;
}
function getDataOneByOne(ids){
if(ids.length > 0){
var id = ids.shift();
console.log("Fetching details for "+ id);
getData(id).then(function(){
getDataOneByOne(ids);
});
}
}
getDataOneByOne([1,2,3,4,5,]);
答案 1 :(得分:0)
使用.reduce顺序解决承诺。
答案 2 :(得分:0)
可以使用递归和全局索引进行模拟。异步,等待解决方案仍然更好:
var index = 0;
function getDataOneByOne(ids){
if (index >= ids.length){
return;
}
console.log("Fetching details for "+ ids[index]);
getData(ids[index]).then(function () {
index++;
getDataOneByOne(ids);
});
}