angular - 访问多个http调用的数据 - 如何解决promise

MyT*_*der 54 http angularjs

我陷入了一些我认为应该直截了当的事情.我需要从三个不同的ajax调用中获取数据,组合并处理所有三个,并将结果数组显示给用户.

在最简单的形式中,我的代码如下所示:

function giftControler ($scope, $http) {
  var names = $http.get("names.json"),
      naughty = $http.get("naughty.json"),
      nice = $http.get("nice.json");
Run Code Online (Sandbox Code Playgroud)

我知道我的变量被分配给promises,而不是实际的结果,并且http请求已经传递给事件队列.如果我用可执行语句跟随这些变量,这些变量将是未定义的.我不明白如何等待这些承诺来解决,以便继续处理它们.

我想做的是立即添加代码:

      for (var i=0; i<names.length; i++){
        for (var j=0; j<nice.length; j++){
          if (names[i] === nice[j]){
            names[i] = names[i] + "--Yay!!";
          };
        };
      };                
      $scope.kids = names;
Run Code Online (Sandbox Code Playgroud)

问题是,我不能像承诺一样解决数组.在http调用之后,Javascript将立即看到这些语句,并尝试立即执行它们,即使承诺尚未解决.

我遇到的问题是$ http api给了我一个带有三个函数的promise对象:error,success&then.在这种情况下,我不知道该如何处理.我需要一个单一的成功功能.我需要全部三个来解决,然后处理每个中的数据,然后将结果分配给角度模型.

我确信我错过了一些明显的东西,但是有人有建议吗?在我的实际工作中,我有几个ajax调用多个数据源和大量处理(比较值,排序,连接等)来提出一个好的数据集合,但我无法通过这个问题.

谢谢,

Val*_*nov 156

你可以使用$ q的'all'功能:

function giftControler ($scope, $http, $q) {
  var names = $http.get("names.json"),
      naughty = $http.get("naughty.json"),
      nice = $http.get("nice.json");
  $q.all([names, naughty,nice]).then(function(arrayOfResults) { 
      ... This callback would be called when all promised would be resolved
    });
Run Code Online (Sandbox Code Playgroud)

这种方式有点清洁.

这是docementation的链接:http://docs.angularjs.org/api/ng.$q

  • 谢谢!这似乎有效.你是如何从令人难以置信的稀疏API文档中弄清楚这个功能的,我永远不会知道.也许正如Angular在他们的Google资金支持下,他们可以聘请技术作家来改进他们的文档. (5认同)
  • 如果一个呼叫失败会发生什么? (5认同)