Массив Json пустой

передал Json в массив, а консоль показала пустую, но с объектами внутри. но при печати с индексом console.info показывает undefind.. что не так ?

let pokeName = [];
let pokeId = [];
let pokeImg = [];
let pokeType = [];
let pokeMove = [];

for (let i=1; i< 21; i++) {
    fetch(`https://pokeapi.co/api/v2/pokemon/${i}/`)
        .then(Response => Response.json())
        .then(data => {
            pokeId.push(data['id']);
            pokeName.push(data['name']);

            const dataTypes = data['types'];
            pokeType.push(dataTypes[0]['type']['name']);

            const dataMoves = data['moves'];
            pokeMove.push(dataMoves[0]['move']['name']);

            pokeImg.push(data['sprites']['front_default']);
        });
}


console.info(pokeName);
console.info(pokeId);
console.info(pokeImg);
console.info(pokeMove);
console.info(pokeType);

Ваш код работает, но вы записываете значения в консоль до того, как обещание будет возвращено из fetch, что означает, что данные еще не были записаны в массивы.

Sup3rkirby 14.09.2022 21:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Журналы вашей консоли запускаются до завершения ваших вызовов выборки. Вы можете использовать async/await для решения проблемы.

Что-то вроде этого должно работать:

let pokeName = [];
let pokeId = [];
let pokeImg = [];
let pokeType = [];
let pokeMove = [];

(async function () {
    for (let i = 1; i < 21; i++) {
        const data = await fetch(`https://pokeapi.co/api/v2/pokemon/${i}/`);
        const json = data.json();

        pokeId.push(json['id']);
        pokeName.push(json['name']);

        const dataTypes = json['types'];
        pokeType.push(dataTypes[0]['type']['name']);

        const dataMoves = json['moves'];
        pokeMove.push(dataMoves[0]['move']['name']);

        pokeImg.push(json['sprites']['front_default']);
    }
})();


console.info(pokeName);
console.info(pokeId);
console.info(pokeImg);
console.info(pokeMove);
console.info(pokeType);

вот альтернативный способ получения данных

const getPokemon =async(id)=>{
return await (await fetch(`https://pokeapi.co/api/v2/pokemon/${id}/`)).json();
}

const getSerializedData = async () =>{

for (let i=1; i< 10; i++) {
  const data = await getPokemon(i);
  console.info(data)
  }
}


getSerializedData();
Ответ принят как подходящий

Как я уже упоминал в своем комментарии, ваш код console.info() запускается до того, как fetch вернет свое обещание, и поэтому данные еще не установлены.

Циклы for на самом деле не работают с ключевым словом await, поэтому обычно вам просто нужно вместо этого преобразовать цикл for в цикл for await...of. Затем вы можете вызвать функцию async, которая перебирает все нужные вам значения, и как только все промисы в цикле будут возвращены, будет выполнен следующий код (в рамках той же функции. Любой код вне функции будет выполняться асинхронно) .

let pokeName = [];
let pokeId = [];
let pokeImg = [];
let pokeType = [];
let pokeMove = [];

let pokeCount = [];
for(let i = 1; i < 21; i++) pokeCount = [...pokeCount, i];

const _FetchPokes = async () => {
  for await (const poke of pokeCount) {
    await fetch(`https://pokeapi.co/api/v2/pokemon/${poke}/`)
      .then(Response => Response.json())
      .then(data => {
        pokeId.push(data['id']);
        pokeName.push(data['name']);
        pokeType.push(data['types'][0]['type']['name']);
        pokeMove.push(data['moves'][0]['move']['name']);
        pokeImg.push(data['sprites']['front_default']);
      });
  }
  
  // This will run AFTER the data has been fetched
  _RunAfterFetch();
}

const _RunAfterFetch = () {
  // Add any code you want to run here
  // This will run AFTER the pokemon data has been fetched
  console.info(pokeName[1-1]);
}

_FetchPokes();

Благодарность! но как мне получить доступ к отдельным массивам?

danielkalinin 14.09.2022 21:57

@danielkalinin Что ты имеешь в виду? Исходя из того, что вы предоставили, данные хранятся в 5 массивах. Идентификатор каждого покемона минус один — это индекс каждого массива, который вам понадобится. Таким образом, покемон с идентификатором 4 (чармандер) будет pokeName[(4-1)] или просто pokeName[3]. Если бы вы хотели, чтобы все данные о покемонах хранились вместе, вы бы предпочли использовать объект, а не отдельные массивы.

Sup3rkirby 14.09.2022 22:04

я понимаю, но когда я делаю console.info(pokeName[1-1]); после вашего кода я получаю неопределенность..

danielkalinin 14.09.2022 22:09

Если вы пытаетесь записать его после строки _FetchPokes(), то это та же проблема с исходным кодом. Данные о покемонах извлекаются асинхронно, то есть остальная часть кода после этой строки продолжает выполняться, пока данные извлекаются (чтобы не заморозить всю страницу). Вот почему мои строки console.info() находятся внутри моей функции. Если вы хотите выполнить больше кода, вы можете вызвать другую функцию (или console.info()) внутри функции _FetchPokes().

Sup3rkirby 14.09.2022 22:13

я имел в виду, что хотел использовать его вне _fetchpokes()

danielkalinin 14.09.2022 22:16

но есть ли способ хранить данные в массивах и использовать их вне выборки?

danielkalinin 14.09.2022 22:17

@danielkalinin Данные хранятся и могут использоваться вне fetch. Концепция здесь, чтобы понять, когда запускается код. Поскольку для получения всех покемонов требуется время, вам нужен код, который ждет, пока все данные о покемонах не будут получены, а затем запускается. Простое добавление строк в JavaScript не поможет. Попробуйте добавить новую функцию с любым кодом, который вы хотите, а затем вызовите эту функцию в конце _FetchPokes(). Я обновлю свой ответ, чтобы показать пример.

Sup3rkirby 14.09.2022 22:22

Другие вопросы по теме