Llamo a una función en un, de esta manera:

for(var i=0; i<$scope.staffdispensers.length; i++){     
                        console.log($scope.staffdispensers[i].dispenser.iddispenser);
                        restService.Enforsaleproductsbyiddispenser($scope.staffdispensers[i].dispenser.iddispenser, _getnumber, _error);
                }

Esta es la implementación de esta función:

Enforsaleproductsbyiddispenser: function(id, _getnumber, _error){
        var currentToken = _GetToken();

        _timerTokenControl(currentToken, _error);

        if (setupTime == null) {
            console.log("token scaduto");
            $window.location.href="login.html";
        }


        if (currentToken !== null) {
        $http({  
                    method : 'GET',  
                    url : REST_URL+'products/nforsalebyiddisp/'+id
                }).then(function successCallback(response) {  
                    _getnumber(response);
                }, function errorCallback(response) {  
                    console.log(response.statusText);  
                });  
           }  else {
                $window.location.href="login.html";
                console.log("NON SEI LOGGATO!!!");
        }
    }

Mirar esto. "_getnumber (respuesta);" se llama después de terminar todo el ciclo for. Esta es la función _getnumber:

function _getnumber(response){
                number.push(response.data);  
                console.log(number);

}

Mirando la consola, en la matriz de números, tengo todos los resultados de la función para cada i:

enter image description here

Pero si trato de actualizar la página, ¡tengo los mismos valores pero en un orden diferente!

enter image description here

Y esto sucede porque "_getnumber (respuesta);" se llama después de terminar todo el ciclo for !! Mira eso:

enter image description here

Quiero llamar _getnumber paso a paso, i by i

En main-employee.js:

enter image description here

En rest-services.js:

enter image description here

0
Alfonso Silvestri 13 ene. 2017 a las 20:28

3 respuestas

La mejor respuesta

Está realizando una llamada ajaxCall con $ http. Esta llamada $ http en particular es asíncrona y no hay garantía de cuánto tiempo llevará.

Está llamando a _getNumber cuando la llamada finalizó correctamente, cuando estalla varias llamadas, la primera llamada puede completarse después de la última.

Por lo tanto, no tendrá un pedido garantizado.

Devolver una promesa:

if (currentToken !== null) {
            return $http({  
                    method : 'GET',  
                    url : REST_URL+'products/nforsalebyiddisp/'+id
                }).then(function successCallback(response) {  
                    _getnumber(response);
                }, function errorCallback(response) {  
                    console.log(response.statusText);  
                });  
        }  else {
                $window.location.href="login.html";
                console.log("NON SEI LOGGATO!!!");

                var def = $q.deferred();
                def.resolve();
                return def.promise;
        }

Escribir una función recursiva que se llame a sí misma cuando se resuelva la promesa

    function recursiveCall(i) {
            if (i < $scope.staffdispensers.length) {
                console.log($scope.staffdispensers[i].dispenser.iddispenser);
restService.Enforsaleproductsbyiddispenser($scope.staffdispensers[i].dispenser.iddispenser, _getnumber, _error)
                .then(function(){
                    recursiveCall(i+1)
                })
            }
        }

Llamar a la llamada recursiva inicial

recursiveCall(0);
1
Adrian Bratu 13 ene. 2017 a las 17:49

Ah, sí. Verá, no hay certeza de que las llamadas $http volverán en el mismo orden. A veces la respuesta es lenta, a veces es rápida. La única forma de hacer cumplir una orden es mediante el uso racional de las promesas. Esto no es difícil de hacer...

Debe utilizar el valor de retorno de la llamada $http, que es una promesa, para imponer el orden de los resultados.

var promises = [];  // this will hold promises in correct order
for(var i=0; i<$scope.staffdispensers.length; i++){     
  console.log($scope.staffdispensers[i].dispenser.iddispenser);
  var promise = restService.Enforsaleproductsbyiddispenser($scope.staffdispensers[i].dispenser.iddispenser, _getnumber, _error);
  promises.push(promise);
}

Ahora puede esperar hasta que todas las promesas se terminen utilizando el proveedor $q:

$q.all(promises).then(function(arrayOfPromises) {  //array is of all resolved promises
  angular.forEach(arrayOfPromises, function(promise) {
    promise.then(function(response) {
      _getnumber(response);
    })
    .catch(function(error) {
    });
  });
});

Tendrá que modificar su llamada $http, para que solo devuelva la respuesta $http:

return $http({  
         method : 'GET',  
         url : REST_URL+'products/nforsalebyiddisp/'+id
       });
0
Pop-A-Stash 13 ene. 2017 a las 17:55

Está llamando a una función asincrónica, lo que significa que el ciclo for probablemente se completará antes de obtener todas las respuestas. El orden depende de cuándo se complete cada llamada asíncrona. Si necesita ordenar los datos, debe implementar un mecanismo para ordenar respuestas O esperar a que se complete la llamada. Una forma de hacerlo es llamar a fetch nuevamente en la devolución de llamada exitosa hasta que se realicen todas las llamadas al servidor.

0
Max Sindwani 13 ene. 2017 a las 17:35