2015-09-07 43 views
0

我有一个关于AngularJS中的异步数据调用的问题。使用数据从一个异步API调用到另一个

问题是我将从一个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()获取结果,因为什么是内发生的循环尚未解决。我真的不能弄清楚如何做到这一点与$q.all(),因为我没有从returnListOfStuff功能尚未

+2

没有你的代码,它很难判断你的问题是什么,但是这听起来像是[带环$ Q承诺(http://stackoverflow.com/q/25671760/1048572) – Bergi

+0

@Bergi的副本添加一些伪代码来更接近地描述问题... – NicT

回答

1

我真的不能弄清楚如何与$q.all()做到这一点,因为我没有参数FR om 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; 
     }); 
    })); 
}); 
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); 
} 
+0

我会尝试做这种方法并报告回来。谢谢,不知道我能做到这一点。 – NicT

+0

@NicT,如果可能,请在您的问题中添加'returnDataForListItem'代码,以获得更多专业帮助。 – user3335966

相关问题