Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

273
Visualizações
Reaccionar: useState (): la obtención de datos durante una obtención en curso no funciona

Quiero mostrar una lista de los más vendidos del New York Times obteniendo los datos a través de una API. Sin embargo, los enlaces de las portadas deben obtenerse de la API de Google Books, ya que la API del NYT no los proporciona.

Por lo tanto, quiero mapear una lista con los datos obtenidos. En el mismo paso en el que obtengo los datos de la API del NYT, también se obtendrán los datos de la API de Google Books. Por lo tanto, uso la palabra clave await para dejar que el código espere a que finalice la segunda búsqueda.

Pero, desafortunadamente, la lista no se actualiza aunque se cumplió la promesa y se obtuvieron los datos. La variable bestsellerlist es una matriz de promesas cumplidas, pero ninguna "matriz real" a la que pueda acceder.

Supongo que debería ser posible dividir la búsqueda y crear la lista a partir de dos matrices: una con los datos de la API del NYT y otra con los datos de la API de Google Books. Sin embargo, me pregunto cómo puedo arreglar el código, para poder obtener todos los datos y crear la lista en un solo paso .

 const fetchLinkCover = async (isbn) => { const res = await fetch(googleApi(isbn)); const json = await res.json(); return json.items[0].volumeInfo.imageLinks.smallThumbnail; };
 useEffect(() => { fetch(nytimesApi) .then((res) => res.json()) .then((json) => { const fetchedBookList = json.results.books; setBestsellerList( fetchedBookList.map(async (item) => { const linkCover = await fetchLinkCover(item.isbns[0].isbn13); return { title: item.title, authors: item.author, ranking: item.rank, cover: linkCover, }; }) ); }); }, []);
 console.log(bestsellerList);

consola después de ejecutar el código

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

.map no hace nada especial con las promesas. Si devuelve una promesa de su función de mapa (y las funciones asíncronas siempre devuelven promesas), entonces .map creará una matriz de promesas. No esperará a que esas promesas se resuelvan.

Para esperar una serie de promesas, puede usar Promise.all para combinarlas en una sola promesa. Luego, llama a .then con esa promesa, o coloca su código en una función async y lo await .

Con .then :

 fetch(nytimesApi) .then((res) => res.json()) .then((json) => { const fetchedBookList = json.results.books; const promises = fetchedBookList.map(async (item) => { const linkCover = await fetchLinkCover(item.isbns[0].isbn13); return { title: item.title, authors: item.author, ranking: item.rank, cover: linkCover, }; }); return Promise.all(promises); }) .then((books) => { setBestsellerList(books); });

O con async / await :

 useEffect(() => { const fetchBooks = async () => { const res = await fetch(nytimesApi); const json = await res.json(); const fetchedBookList = json.results.books; const promises = fetchedBookList.map(async (item) => { const linkCover = await fetchLinkCover(item.isbns[0].isbn13); return { title: item.title, authors: item.author, ranking: item.rank, cover: linkCover, }; }); const books = await Promise.all(promises); setBestsellerList(books); }; fetchBooks(); }, []);
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda