将来自一个异步API调用的数据用于另一个

时间:2015-09-07 21:33:49

标签: javascript angularjs asynchronous

我对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函数中的参数

2 个答案:

答案 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;
        });
    }));
});