1

Tengo una lista llamada 'aseguradoras':

var aseguradoras = [aseguradora1,aseguradora2,aseguradora3];

Quiero hacer una llamada a un servicio con cada aseguradora, en este caso 3 llamadas. El problema es que tengo que hacer las llamadas asíncronas, para ir añadiendo el objeto que me devuelva en un array según la llamada que termine antes.

            for(var i=0; i<aseguradoras.length; i++){
                datos.ASEGURADORA = aseguradoras[i];
                PresupuestoService.getTarificacionByAseguradora(datos).then(
                    function successCallback(response){
                        vm.tarifas.push(response.data.TARIFAS);
                    },
                    function(error){
                        console.log('Unsuccesful');
                    }
                );
            }

Llamada a servicio REST:

function PresupuestoService($http, $rootScope, BASE_CON) {

        var token = _.get($rootScope, 'globals.currentUser.token');
        token = token || '';

        var service = {};

        service.getTarificacionByAseguradora = getTarificacionByAseguradora;

        function getTarificacionByAseguradora(json){
            var url=BASE_CON+"/Presupuestos/getTarificacionByAseguradora";
            return get(url,token,json);
        }

        //Get
        function get(url, token, json){
            return $http({
                method: 'POST',
                url: url,
                data: json,
                headers: {'Authorization':'Token ' + token , 'Content-Type': 'application/json'}    //Permiso para la petición.
            });
        }
    };

Anteriormente, recorria las aseguradoras en un bucle y hacia la llamada, pero eso no me sirve, porque hasta que no acabe esa llamada no empieza la siguiente, y eso es lo que quiero, que se hagan todas a la vez y lo que devuelva meterlo en un array.Espero que me podais ayudar, me he informado mucho sobre la asincronia en javascript y no me queda muy claro...

1 Answers1

2

Como dice @PabloLozano las llamadas se hacen sin esperar la respuesta.

Edito. Pongo un ejemplo para que veas que tal y como lo tienes no está esperando a que finalice la llamada de todas las promises.

let aseguradoras = ["aseg1","aseg2","aseg3"];
let aseguradorasTimeout = [5000,1000,2500];
let llamadasFinalizadas = [];
for(var i=0; i<aseguradoras.length; i++){
  later(aseguradorasTimeout[i],aseguradoras[i]).then(
    function successCallback(response){
      llamadasFinalizadas.push(response);
      console.log(llamadasFinalizadas);
    },
    function(error){
      console.log('Unsuccesful');
    }
  );
}

function later(delay,name) {
    return new Promise(function(resolve) {
        setTimeout(function(){
        resolve("Soy " + name + " y he terminado en " + delay + " ms.");
      }, delay);
    });
}
Kiko_L
  • 6,455
  • 1
  • 11
  • 25
  • No, eso es más o menos lo que me hace el bucle. Si supuestamente esas 3 llamadas se están haciendo a la vez, necesito que según acabe una llamada, añada lo que recibe en la lista de tarifas y no tenga que esperar a que acaben todas para añadirlo a la lista. – Richard Sánchez Coliao Jan 14 '19 at 14:18
  • Acabo de editar la respuesta con un ejemplo. Tal y como lo tienes no está esperando a que termine una para añadir al array. Las promises se van lanzando y se van completando asíncronamente. – Kiko_L Jan 14 '19 at 14:42
  • He editado el código de arriba a como más o menos me has dicho tú. Cuando recorre el bucle 1, 2, 3 o las veces que sean, no me hace la llamada hasta que lo recorra entero, entonces ahí es cuando me hace las 5 (por ejemplo) llamadas a la vez y con la misma aseguradora.. No hace las llamadas con todas las aseguradoras, si no con la última de la lista. – Richard Sánchez Coliao Jan 14 '19 at 16:59
  • Puedes poner el código de `PresupuestoService.getTarificacionByAseguradora`? – Kiko_L Jan 14 '19 at 18:33