2

Tengo en mi controlador:

$scope.test= function () {      
    var list = ["var0","var1","var2","var3"];
    var result= 0;

    for (var x=0;x<list.length;x++) { 
    result= result + TestService.loadVariable(list[x])
    }

    $scope.result = result;
}

y mi servicio es :

    loadVariable : function(name) {
        return $http({
             method: 'GET',
             url: "/test/sheet/loadVariable/",
             params: {name: name},
            }).then(function success(response) {
                return response.data;
            }, function error(response) {

            });
    },

el problema es que siempre me sale 0 el result y creo q es porque no le da tiempo a ejecutarse los metodos de loadvariables, alguna sugerencia?

sirdaiz
  • 1,253
  • 5
  • 31
  • 49

2 Answers2

4

El servicio $http retorna una promesas así que puedes utilizar el servicio $q para esperar a que se terminen de ejecutar las promesas utilizando el metodo all([]). Este metodo lo que hace es esperar a que todas las promesas se ejecuten y luego ejecuta el metodo then() que te data las respuestas de cada petición.

Por ejemplo, aqui se ejecuta un ajax segun la cantidad de veces que le indice y fijate como al final se obtenen todas las respuestas:

angular.module("app",[])
.controller("ctrl", function($scope,$http,$q){
  
  $scope.cargarVariables = function(){
    // variable para guardas las promesas
    var promises = [];
    for(var i =0; i < parseInt($scope.cantidad);i++)
    {
      // cada peticion retorna una promesa, la agregamos al array de las promesas
      promises.push($http.get("https://jsonblob.com/api/jsonBlob/3263204c-b42b-11e7-81b3-cb2653b9ed90"))
    }
    
     // $q.all espera a que se terminen todas y luego ejecuta la funcion then
    $q.all(promises).then(function(respuestas){
      var datas = [];

       // por cada respuesta obtenemos la propiedad data que tiene lo que necesitamos
      for(var i = 0; i < respuestas.length;i++)
      {
        datas.push(respuestas[i].data);
      }
      
       // imprimirmos la data
      console.log(datas);
    });
  }
  
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="app" ng-controller="ctrl">
<input type="number" placeholder="cantidad de N variables a buscar" ng-model="cantidad" />
<button ng-click="cargarVariables()"> cargar variables</button>
</div>

En tu caso seria:

$scope.test= function () {      
    var list = ["var0","var1","var2","var3"];
    var promesas = [];

    for (var x=0;x<list.length;x++) { 
      promesas.push(TestService.loadVariable(list[x]));
    }
    $q.all(promesas).then(function(respuestas){
        console.log(respuestas);// manejas las respuestas de cada peticion
     })
    $scope.result = result;
}
Einer
  • 20,190
  • 2
  • 14
  • 36
1

Podrías intentarlo de la siguiente manera:

Simplemente es ir sumando los valores y por me dio de un contador saber cuando el ciclo llega al final, inmediatamente llegue al final se asigna el valor final a la variable requerida.

$scope.test= function () {      
    var list = ["var0","var1","var2","var3"];
    var result= 0;
    var contador = 0;

    for (var x = 0; x < list.length; x++) {  
        TestService.loadVariable(list[x]).then(function(respuesta){
            result = (Number(result) + Number(respuesta))

            contador++;

            if(contador == list.length){
                $scope.result = result;
            }
        });
    }
}
Bender Paisa
  • 12,491
  • 4
  • 23
  • 41