es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Devolver objeto de Promise.all(…)

Estoy usando una API para recuperar datos (de varios aeropuertos), basados en sus códigos de aeropuerto…

async function airpt(codes){
    const airportCredential = {
      "method": "GET",
      "headers": {
        "x-rapidapi-host": "airport-info.p.rapidapi.com",
        "x-rapidapi-key": "xxxx"
      }
    }

    return Promise.all(
      codes
      .map(code =>
        fetch("https://airport-info.p.rapidapi.com/airport?iata="+code,airportCredential)
        .then(r => r.json())
      )
    );

  }

Una llamada como airpt(['JFK','LAX'] produce un array con resultados como este:

Array(2)
0: {id: 3406, iata: 'JFK', icao: 'KJFK', name: 'John F. Kennedy International Airport', location: 'New York City, New York, United States', …}
1: {id: 4044, iata: 'LAX', icao: 'KLAX', name: 'Los Angeles International Airport', location: 'Los Angeles, California, United States', …}
length: 2

Eso funciona bien. Pero ¿cómo devolvería una única promesa desde esta función con todos los datos empaquetados en un objeto, que utiliza los valores de entrada codes como claves?

Sé cómo transformar el array en un objeto:

array.reduce((obj, item) => {
    return {
      ...obj,
      [item['iata']]: item,
    };
  }, {});

Sé cómo hacerlo, usando .then(...) después de que Promise.all() se haya resuelto. Sin embargo, me gustaría tener el reempaquetado en un objeto como parte de la función asíncrona.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para empaquetar los datos en un objeto con codes como claves, puede modificar la llamada de Promise.all para mapear los resultados a un objeto con el código como clave:

    async function airpt(codes){
      const airportCredential = {
        "method": "GET",
        "headers": {
          "x-rapidapi-host": "airport-info.p.rapidapi.com",
          "x-rapidapi-key": "xxxx"
        }
      }
    
      const results = await Promise.all(
        codes
        .map(code =>
          fetch(`https://airport-info.p.rapidapi.com/airport?iata=${code}`, airportCredential)
          .then(r => r.json())
        )
      );
    
      const data = results.reduce((obj, item) => {
        return {
          ...obj,
          [item['iata']]: item,
        };
      }, {});
    
      return data;
    }
    

    Esta función modificada primero espera el resultado de Promise.all y lo almacena en results. Luego usa reduce para transformar el array de results en un objeto con codes como claves. Finalmente, devuelve el objeto data como una promesa única.

Comments are closed.