Подтвердить что ты не робот

Angular - доступ к данным нескольких HTTP-вызовов - как разрешить promises

Я застрял на чем-то, что, по-моему, должен быть прямолинейным. Мне нужно взять данные из трех различных вызовов ajax, объединить и обработать все три и отобразить результирующий массив для пользователя.

В своей простейшей форме мой код выглядит следующим образом:

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

Я понимаю, что мои переменные присваиваются promises, а не фактическим результатам, и что http-запрос передан в очередь событий. Если я буду следовать им с исполняемыми операторами, эти переменные будут undefined. Я не понимаю, как дождаться, когда эти promises будут разрешены, чтобы продолжить их обработку.

То, что я хотел бы сделать, это сразу добавить код:

      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;

Проблема в том, что я не могу просто работать с promises, как если бы они были решены массивами. Javascript увидит их для операторов сразу после http-звонков и попытается выполнить их немедленно, даже если promises не был разрешен.

Где я застрял в том, что $http api дает мне объект обещания с тремя функциями: error, success и then. Я не уверен, что делать с этим в этом случае. Мне нужна единственная функция успеха для всех трех. Мне нужно, чтобы все три разрешались, затем обрабатывали данные в каждом, а затем присваивали результат модели angular.

Я уверен, что мне не хватает чего-то очевидного, но есть ли у кого-нибудь предложение? В моей реальной работе у меня есть несколько ajax-вызовов нескольких источников данных и много обработки (сравнение значений, сортировка, конкатенация и т.д.), Чтобы создать один хороший сбор данных, но я не могу передать эту проблему.

Спасибо,

4b9b3361

Ответ 1

Вы можете использовать функцию $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