Return 来自 Promise.all(...) 的对象

Return object from Promise.all(...)

我正在使用 API 根据机场代码检索(几个机场的)数据...

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())
      )
    );

  }

airpt(['JFK','LAX'] 这样的调用会产生一个数组,结果如下:

 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

一切正常。但是我如何 return 来自此函数的(单个)承诺,并将所有数据打包到一个对象中,该对象使用输入 codes 作为键?

我知道如何将数组转换为对象:

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

我知道怎么做,在 Promise.all() 解决后使用 .then(...)。但是,我想将重新打包到一个对象中作为异步函数的一部分。

您似乎已经拥有所需的部分,所以希望您只需要将它们放在一起即可。下面是在 promise.all 和 return 一个基于数组的对象之后执行一些额外代码的样子:

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

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

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