在另一个函数中使用来自异步函数的 return 数据
Using return data from an async function, in another function
我正在根据 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();
我无法让其他函数等待第一个函数的 return。我知道我应该使用 promises 或以不同的方式构建我的其他功能,但我仍然掌握这些类型的功能。
您需要在 grabPlayerScores
函数中添加另一个 await
以等待 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)
}
}
我修改了你的代码,
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)
}
}
作为最佳实践,您应该确保所有函数 return 都有一个值。使用 const
表示不会更改的变量,使用 let
表示您绝对会更改的变量。注意 name = ...
你没有写 const
或 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)
我正在根据 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();
我无法让其他函数等待第一个函数的 return。我知道我应该使用 promises 或以不同的方式构建我的其他功能,但我仍然掌握这些类型的功能。
您需要在 grabPlayerScores
函数中添加另一个 await
以等待 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)
}
}
我修改了你的代码,
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)
}
}
作为最佳实践,您应该确保所有函数 return 都有一个值。使用 const
表示不会更改的变量,使用 let
表示您绝对会更改的变量。注意 name = ...
你没有写 const
或 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)