Проблема с отображением карточек с данными, которые я привожу из API

#javascript #dom #foreach

#javascript #dom #foreach

Вопрос:

я пытаюсь отобразить некоторые карты pokemon с данными, которые я привожу из API (pokemonAPI). Я могу вывести все данные, которые мне нужны, из API, за исключением типа и возможностей. Но это не главные проблемы, так как я уже привожу самые важные данные, которые мне нужны. Моя проблема возникает внутри foreach, который не является функцией renderPokemons. Любая подсказка, могу ли я решить это?

 

const getAllPokemons =  async (url) => {
    try {
        const pokemons = await fetch(url);
        return pokemons.json()
    }catch (e) {
        console.log(e)
    }
}
const getSinglePokemon =  async (url) => {
    try {
        const pokemon = await fetch(url);
        return  pokemon.json()
    }catch (e) {
        console.log(e)
    }
}
document.addEventListener('DOMContentLoaded',async (ev)=> {
    const URL  = 'https://pokeapi.co/api/v2/pokemon';
    const pokemons  = await getAllPokemons(URL);
    const pomekonDataPromises = pokemons.results.map (async pokemon => {
        const pokeTemp = await getSinglePokemon(pokemon.url)
        return {
            name: pokemon.name,
            weight : pokeTemp.weight,
            height : pokeTemp.height,
            // type: pokeTemp.types.type.name,
            image : pokeTemp.sprites.other.dream_world.front_default,

        }
    })
    const pokemonJson = await Promise.all (pomekonDataPromises)
    console.log(pokemonJson)

    const parentContainer = document.querySelector('.containerCards');
    renderPokemons(parentContainer,pokemonJson);
})

////FUNCTION TO RENDER POKEMONS
const renderPokemons = (parent,apiResponse) => {
    apiResponse.forEach((data) => {
        const parentTemplate = document.createElement('div');
        parentTemplate.innerHTML=`<div class="card" style="width: 18rem;">
        <img class="img card-img-top" src="${data.sprites.other.dream_world.front_default}" alt="Pokemon image">
        <div class="card-body">
          <h5 class="name card-title">Name:</h5>
          <p class="weight card-text">Weight: </p>
          <p class="height card-text">Height: </p>
        </div>
      </div>`
      parent.appendChild(parentTemplate)
    });
}

 

Комментарии:

1. Вы не указали имя, рост и вес покемона, поэтому они не будут отображаться

2. я знаю, сначала я пробовал с изображениями, но даже этого не получается. Поскольку в нем говорится, что проблема связана с forEach

Ответ №1:

sprites.other.dream_world.front_default не существует в data . Этот путь существует в исходных данных, но не в объекте, созданном в прослушивателе событий. У него есть только name, weight, height, and image . Изменение его на data.image будет работать.

 const getAllPokemons = async(url) => {
  try {
    const pokemons = await fetch(url);
    return pokemons.json()
  } catch (e) {
    console.log(e)
  }
}
const getSinglePokemon = async(url) => {
  try {
    const pokemon = await fetch(url);
    return pokemon.json()
  } catch (e) {
    console.log(e)
  }
}
document.addEventListener('DOMContentLoaded', async(ev) => {
  const URL = 'https://pokeapi.co/api/v2/pokemon';
  const pokemons = await getAllPokemons(URL);
  const pomekonDataPromises = pokemons.results.map(async pokemon => {
    const pokeTemp = await getSinglePokemon(pokemon.url)
    return {
      name: pokemon.name,
      weight: pokeTemp.weight,
      height: pokeTemp.height,
      // type: pokeTemp.types.type.name,
      image: pokeTemp.sprites.other.dream_world.front_default

    }
  })
  const pokemonJson = await Promise.all(pomekonDataPromises)

  const parentContainer = document.querySelector('.containerCards');
  renderPokemons(parentContainer, pokemonJson);
})

////FUNCTION TO RENDER POKEMONS
const renderPokemons = (parent, apiResponse) => {
  apiResponse.forEach((data) => {
    const parentTemplate = document.createElement('div');
    parentTemplate.innerHTML = `<div class="card" style="width: 18rem;">
        <img class="img card-img-top" src="${data.image}" alt="Pokemon image">
        <div class="card-body">
          <h5 class="name card-title">Name: ${data.name}</h5>
          <p class="weight card-text">Weight: ${data.weight}</p>
          <p class="height card-text">Height: ${data.height}</p>
        </div>
      </div>`
    parent.appendChild(parentTemplate)
  });
} 
 <div class="containerCards"></div>