Soy bastante nuevo en JS y especialmente en la programación asíncrona. Estoy tratando de crear una aplicación Express + React que muestre la información de un usuario de gitHub (incluidos algunos repositorios con 5 confirmaciones).
Para hacer esto último, estoy usando Promise.all y map para obtener las confirmaciones de cada repositorio en una matriz y devolver una matriz con las confirmaciones agregadas a cada repositorio.
Cuando consuelo. registro el nuevo repositorio en la función de mapa, funciona, pero cuando intento devolver la matriz, los objetos no están definidos.
Supongo que esto se debe a que la devolución se está ejecutando antes de que se hayan resuelto las Promesas. ¿Puede alguien ayudarme con esto?
//takes a username and collection of repos and finds their commits using fetch to github API. Returns the array of repos with their commits as a new property const getGitHubCommits = async (username, repos) => { try { const repositories = await Promise.all( repos.map(async (repo) => { fetch(`https://api.github.com/repos/${username}/${repo.name}/commits?per_page=5`).then(response => response.json()) .then(async response => { repo.commits = response.slice(0, 5) console.log(repo) return await repo }) }) ); console.log(repositories) return repositories } catch (error) { console.log(error) return "No commits found found" } }No necesita async / await aquí en absoluto. Tan pronto como coloque async delante de una función, la función devolverá una promesa y deberá resolver esa promesa en ese momento.
Aquí hay una versión mejor:
const getGitHubCommits = (username, repos) => { return Promise.all( repos.map((repo) => fetch( `https://api.github.com/repos/${username}/${repo.name}/commits?per_page=5` ) .then((response) => response.json()) .then((response) => { repo.commits = response.slice(0, 5) return repo }) ) ) }Esto es mucho más limpio. Más tarde necesitas resolver la promesa:
getGitHubCommits('...', ['...']) .then((result) => { console.log(result) }) .catch((err) => { console.log(err) }) O puede usar aquí async / await si lo llama dentro de una función asíncrona:
try { let commits = await getGitHubCommits('..', ['..']) console.log(commits) } catch (err) { console.log(err) }