【问题标题】:Using data from one async API call to another使用从一个异步 API 调用到另一个的数据
【发布时间】:2015-09-08 18:25:24
【问题描述】:

我有一个关于 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 函数的参数

【问题讨论】:

  • 没有你的代码很难判断你的问题是什么,但这听起来像是$q promise with loop的重复
  • @Bergi 添加了一些伪代码来更接近地描述问题...

标签: javascript angularjs asynchronous


【解决方案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;
        });
    }));
});

【讨论】:

    【解决方案2】:

    尝试为此使用$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);
    }
    

    【讨论】:

    • 我会尝试采用这种方法并报告回来。谢谢,不知道我能做到这一点。
    • @NicT,如果可能,请在您的问题中添加returnDataForListItem 代码,以获得更专业的帮助。
    猜你喜欢
    • 2020-03-04
    • 2016-12-31
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2022-06-29
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多