Как сделать вызов выборки в другой выборке и добавить данные в массив, используя Node.js? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь получить имя, рост и название фильма каждого человека с помощью API и получить. Во-первых, я выбираю из конечной точки людей и получаю массив результатов. Я создаю массив и obj, чтобы я мог в конечном итоге перебрать массив и вывести его в таблицу. Я перебираю результаты, чтобы получить первый URL-адрес фильма от каждого человека, а затем получить его по этому URL-адресу. Я создаю пару ключ / значение для имени, высоты и заголовка, а затем нажимаю на массив. Проблема, с которой я столкнулся, заключается в том, что когда я утешаю массив, он отображает массив из 10 пустых объектов. Я не уверен, почему это делает это. У меня было много проблем, и я не могу их решить. Есть ли лучший способ сделать это?

    fetch('https://swapi.co/api/people/') 
    .then(res => res.json()) 
    .then(json => {
        let results = json.results
        let arr = []
        let obj = {}
        for (let i = 0; i < results.length; i++) {
            let firstFilm = results[i].films[0]
            fetch(firstFilm).then(res => res.json()).then(data => {
                obj['name'] = results[i].name
                obj['height'] = results[i].height
                obj['title'] = data.title
            })
            arr.push(obj)
        }
        console.log(arr) // [ {}, {}, {}, {}, {}, {}, {}, {}, {}, {} ]
    })

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Переключитесь на async / await, и ваш код станет легче следовать IMO

async function doTheThing() {
  const res = await fetch('https://swapi.co/api/people/');
  const json = await res.json();
  const result = await Promise.all(
    json.results.map(async(item) => {
       const res = await fetch(item.films[0]);
       const film = await res.json();
       return {
         name: item.name,
         heihgt: item.height,
         title: film.title
       };
    })
  );
  console.log(result);
}
doTheThing();

Рабочий пример (URL изменен для данных выборки)

async function doTheThing() {
  const res = await fetch('https://greggman.github.io/doodles/test/data/films.json');
  const json = await res.json();
  const result = await Promise.all(
    json.results.map(async(item) => {
       const res = await fetch(item.films[0]);
       const film = await res.json();
       return {
         name: item.name,
         heihgt: item.height,
         title: film.title
       };
    })
  );
  console.log(result);
}
doTheThing();
0 голосов
/ 01 ноября 2019

Использование Promise.all должно помочь.

fetch('https://swapi.co/api/people/')
  .then(res => res.json())
  .then(json => {
    return Promise.all(
      json.results.map(
        item => fetch(item.films[0])
        .then(x => x.json())
        .then(film => ({
          name: item.name,
          heihgt: item.height,
          title: film.title
        }))))
  }).then(console.log)
...