2015-05-16 4 views
1

У меня есть следующая функция, которая создает массив объектов внутри models, однако, когда я прихожу к использованию models дальше в приложении, я не могу пройти через его содержимое, чтобы вытаскивать данные.Угловая петля через массив объектов

Каждого метод петли я пытался до сих пор, содержащими один console.log() сообщения просто выводит сообщение разы сообщения, когда models будет содержать два объектов, так что я думаю, что проблема на самом деле лежит создание models. Если я создам обещание и распечатаю значение models.devices, когда он будет закончен, будет возвращен пустой массив.

Любые идеи?

var d = devices.split(','), 
    count = 0, 
    models = {devices:[]}; 

angular.forEach(d, function (device, i) { 

    var index = i; 

    if (index <= 1) { 

     var deviceName = device.replace(/ /g,"+").toLowerCase(), 
      req = '?__url_path_param=' + deviceName; 

     $http 
      .get('/api/cheapest_by_name' + req) 
      .success(function (obj) { 
       models.devices.push(obj.device); 
       count++; 
      }); 

    } 

}); 

$q.all(models).then(function (data) { 
    apiDeal.multi(data, 3, 2); 
}); 

... Тогда (в апи-deal.factory.js)

function apiDeal($http, $rootScope) { 

    return { 

     multi: function (devices, limit, type) { 

      console.log(devices); // equal to below image 
      console.log(devices.devices); // equal to '[]' 

     } 

    } 

} 

console.log(devices)

Я тогда нужно перебрать devices в apiDeal.multi

+0

Как вы ждете ваших HTTP запросов, чтобы закончить? Я вижу, что вы отказываетесь от обещаний, возвращаемых $ http, которые позволят вам это сделать. –

+0

Не совсем уверен, что не работает для вас. Является ли модель неопределенной или чем-то еще? Что означает * неспособность перебирать содержимое своего содержимого *? –

+0

@OmriAharon 'models.devices' пуст или не определен – leaksterrr

ответ

2

Вы должны держать массив обещаний, который должен заменить models, вы используете $q.all. Это должно быть множество обещаний.

Так изменить код следующим образом:

var d = devices.split(','), 
    count = 0, 
    models = {devices:[]}, 
    promises = []; 

var promise = $http 
      .get('/api/cheapest_by_name' + req) 
      .success(function (obj) { 
       models.devices.push(obj.device); 
       count++; 
      }); 

promises.push(promise); 

А потом, сделайте следующее:

$q.all(promises).then(function (data) { 
    apiDeal.multi(data, 3, 2); 
}); 

Simple Fiddle demonstration

+1

Обратите внимание, что '$ q.all()' будет передавать массив всех результатов обещаний в 'data' параметр функции в ее 'then'. В этом случае, если это возможно, может быть лучше просто выполнить apiDeal.multi (models.devices, 3, 2); ', иначе' data' нужно будет отсортировать, прежде чем его можно будет передать на apiDeal.multi() '. – JcT

+1

@JcT Звучит о праве. Я предполагаю, что теперь OP получает свои данные, он будет менять код :) –

+0

@OmriAharon correct :) Спасибо, ребята. – leaksterrr

Смежные вопросы