我对AngularJS中的异步数据调用有疑问。
问题是我将从一次API调用中接收数组中的多个对象,并且我将不得不使用来自不同API调用的数据扩展这些对象。
我正在考虑嵌套异步调用,但就如何使用$ q服务而言,我的逻辑有点短暂。我有一个服务,它将返回已通过第二个调用扩展的对象,因此我可以在控制器中使用它来在视图中显示。
第一个API调用返回了第二个API调用所需的一些参数,以便获取我将返回给控制器的相关数据。
我将不得不在第一个调用内部循环,这样我就可以在其中运行第二个API调用,但是如何将它返回给我的控制器呢?我无法在第一个循环运行时解决,因为它解释了自己。
这类似的解决方案是什么?
编辑,我在伪javascript中的问题:
returnListOfStuff().then(function (data) {
var result = data.Result;
for (var i = 0; i < result.length; i++) {
var dataForListItem = null;
returnDataForListItem(result[i].ID).then(function (data) {
dataForListItem = data;
});
for (prop in dataForListItem[0]) {
result[i].prop = dataForListItem[0][prop];
}
}
return result;
});
很明显,这不会起作用,因为它只会从第一个调用returnListOfStuff()
中获取结果,因为for循环中发生的事情尚未解决。我无法通过$q.all()
了解如何执行此操作,因为我还没有returnListOfStuff
函数中的参数
答案 0 :(得分:1)
请尝试使用$q.all()
:
var loadQ = [];
var dataForListItem = null;
for (var i = 0; i < result.length; i++) {
loadQ.push(returnDataForListItem(result[i].ID));
}
$q.all(loadQ).then(function(values){
dataForListItem = values;//or values[0], I dnt known Your data structure;
});
如果您对i
值有疑问,请尝试使用:
for (var i = 0; i < result.length; i++) {
(function(e) {
loadQ.push(returnDataForListItem(result[e].ID));
})(i);
}
答案 1 :(得分:1)
我无法确定如何使用
$q.all()
执行此操作,因为我还没有returnListOfStuff
函数中的参数
您可以在拥有它们的then
回调中执行此操作。
您可以返回$q.all
从回调中获得的承诺,以获得支持result
的承诺。
returnListOfStuff().then(function (data) {
var result = data.Result;
return $q.all(result.map(function(resultItem) {
return returnDataForListItem(resultItem.ID).then(function (data) {
for (prop in data[0]) {
resultItem[prop] = data[0][prop];
}
return resultItem;
});
}));
});