我正在從 chess.com 資料中進行一些資料分析
我有這個代碼
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();
我無法讓另一個函式等待第一個函式的回傳。我知道我應該使用 promise 或以不同的方式構建我的其他函式,但我仍然掌握了這些型別的函式的竅門。
uj5u.com熱心網友回復:
您需要await在grabPlayerScores函式中添加另一個以等待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)
}
}
uj5u.com熱心網友回復:
我改變了你的代碼,
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)
}
}
uj5u.com熱心網友回復:
作為最佳實踐,您應該確保所有函式都回傳一個值。使用const該不會改變,和變數let的變數,你絕對會改變。注意name = ...你沒有寫的地方const or let,因為這會names變成一個全域 -
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)))
}
現在grabPlayerScores將是一個包含所有玩家分數的承諾 -
grabPlayerScores().then(console.log).catch(console.error)
[ ..., ... ,... ]
也許您希望在最終輸出中將玩家資料與得分資料相結合?
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: ... } ]
另一個好的做法是讓你的函式帶引數。這使它們在您程式的其他區域中更可重用 -
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)
})))
}
現在您將"RE"作為引數傳遞給您的函式,讓您可以輕松地將該函式重用于其他國家/地區 -
grabPlayerScores("RE").then(console.log).catch(console.error)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318800.html
標籤:javascript 节点.js 异步 承诺
