Estoy haciendo un pequeño análisis de datos de los datos de chess.com
tengo este codigo
const getUsernames = async function() { let response = await chessAPI.getCountryPlayers('RE') names = [...response.body.players] //console.log(names) return names } const grabPlayerScores = async function() { let players = getUsernames() // let playerStats = []; for (i = 0; i = players.length; i++) { let data = await chessAPI.getPlayerStats(i) console.log(data) } } grabPlayerScores();No puedo hacer que la otra función espere el regreso de la primera. Sé que debería usar promesas o estructurar mi otra función de manera diferente, pero todavía me estoy acostumbrando a este tipo de funciones.
Como práctica recomendada, debe asegurarse de que todas sus funciones devuelvan un valor. Use const para las variables que no cambiarán y let para las variables que absolutamente cambiará. Tenga cuidado con name = ... donde no escribió const o let , ya que esto convierte names en un global -
const getUsernames = async function() { const response = await chessAPI.getCountryPlayers('RE') return response.body.players // <- probably no need to copy } const grabPlayerScores = async function() { const players = await getUsernames() return Promise.all(players.map(p => chessAPI.getPlayerStats(p))) } Ahora grabPlayerScores será una promesa que contiene una matriz de todos los puntajes de los jugadores:
grabPlayerScores().then(console.log).catch(console.error) [ ..., ... ,... ]¿Quizás desee que los datos del jugador se combinen con los datos de la puntuación en el resultado final?
const grabPlayerScores = async function() { const players = await getUsernames() return Promise.all(players.map(async p => ({ player: p, scores: await chessAPI.getPlayerStats(p) }))) } grabPlayerScores().then(console.log).catch(console.error) [ { player: "alice", scores: ... }, { player: "brenda", scores: ... }, { player: "catherine", scores: ... } ]Otra buena práctica es hacer que sus funciones tomen parámetros. Esto los hace más reutilizables en otras áreas de su programa -
const getUsernames = async function(countryCode) { const response = await chessAPI.getCountryPlayers(countryCode) return response.body.players } const grabPlayerScores = async function(countryCode) { const players = await getUsernames(countryCode) return Promise.all(players.map(async p => ({ player: p, scores: await chessAPI.getPlayerStats(p) }))) } Ahora pasa "RE" como argumento a su función, lo que le permite reutilizar fácilmente esta función para otros países:
grabPlayerScores("RE").then(console.log).catch(console.error)Debe agregar otra await en su función grabPlayerScores para esperar a que finalice getUsernames .
const grabPlayerScores = async function() { // Add an 'await' here let players = await getUsernames(); for(let i = 0; i = players.length; i++) { let data = await chessAPI.getPlayerStats(i) console.log(data) } }Cambié un poco en tu código,
const grabPlayerScores = async function () { let players = await getUsernames(); for (i = 0; i = players.length; i++) { let data = await chessAPI.getPlayerStats(players[i]); console.log(data) } }