54

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

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

function giftControler ($scope, $http) {
  var names = $http.get("names.json"),
      naughty = $http.get("naughty.json"),
      nice = $http.get("nice.json");

我知道我的变量被分配给承诺,而不是实际结果,并且 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;

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

我卡住的地方是$http api给了我一个具有三个功能的 promise 对象:error, success& then。在这种情况下,我不确定该怎么做。我需要为这三个函数提供一个单一的成功函数。我需要全部三个来解决,然后处理每个中的数据,然后将结果分配给角度模型。

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

谢谢,

4

1 回答 1

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

这种方式稍微干净一些。

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

于 2013-01-27T08:42:00.407 回答