2015-07-13 6 views
0

Я использую угловую фабрику с вызовом $ http.get, чтобы вернуть объект обещания со всеми автобусами и их свойствами депо и области.

Я столкнулся с классическими проблемами асинхронного запроса с последующим кодом. Console.log (allBuses) возвращает пустой объект до того, как console.log (depot) вернет имена депо во вложенной функции $ http.get.

Без использования методов setInterval или Timeout, как мне разрешить объект allBuses после того, как все шины присвоены свойствам депо и области?

.factory('busesByDepot', ['$http', 'Camelize', function($http, Camelize){ 

// get all depot data from depots object 
return $http.get('data/depotList.json').success(function(data) { 

    allBuses = {}; 

    data.data.forEach(function(depot){ 
     var camelName = Camelize.strToCamel(depot.name); 
     if(depot.active == true){ 

      $http.get('data/'+ camelName +'.json').success(function(data) { 
       data.forEach(function(d){ 
        allBuses[d.num] = {depot: camelName, area: d.area}; 
       }) 
       console.log(depot); 
      }) 
     } 
    }) 
    console.log(allBuses); 
}); 

}]) 
+0

я удалил мой ответ, так как я не видел внешний 'forEach' –

+0

первое решение, которое приходит на ум создает обещание и его решения после завершения Foreach –

ответ

0
.factory('busesByDepot', ['$http', 'Camelize', '$q', function($http, Camelize, $q){ 
var deferred = $q.defer(); 
// get all depot data from depots object 
$http.get('data/depotList.json').success(function(data) { 

    allBuses = {}; 
    inc = 0; 

    data.data.forEach(function(depot){ 
     var camelName = Camelize.strToCamel(depot.name); 
     if(depot.active == true){ 

      $http.get('data/'+ camelName +'.json').success(function(data) { 
       data.forEach(function(d){ 
        allBuses[d.num] = {depot: camelName, area: d.area}; 
       }) 
       inc++; 
       if(inc ==2){ 
        deferred.resolve(allBuses) 
       }; 
      }) 

     } 
    }) 

}); 

return deferred.promise; 

}])