Javascript 为什么这个arrow函数返回一个承诺{<;pending>;}
我正在将一个JSON文件读入node.js代码,但是在retrieveTeamData函数中,我在控制台输出中得到了一个承诺{}。最初,我没有在retrieveTeamData函数中使用async/await,但我认为如果问题是承诺在解决之前超时,它会有所帮助Javascript 为什么这个arrow函数返回一个承诺{<;pending>;},javascript,node.js,json,promise,path,Javascript,Node.js,Json,Promise,Path,我正在将一个JSON文件读入node.js代码,但是在retrieveTeamData函数中,我在控制台输出中得到了一个承诺{}。最初,我没有在retrieveTeamData函数中使用async/await,但我认为如果问题是承诺在解决之前超时,它会有所帮助 const PLAYERS_PATH = path.join(__dirname, 'json_files', 'absences.json'); const COACHES_PATH = path.join(__dirname,
const PLAYERS_PATH = path.join(__dirname, 'json_files', 'absences.json');
const COACHES_PATH = path.join(__dirname, 'json_files', 'members.json');
const readJsonFile = (path) => new Promise((resolve) => fs.readFile(path, 'utf8', (_, data) => resolve(data)))
.then((data) => JSON.parse(data))
.then((data) => data.stats);
async function retrieveTeamData() {
const players = async () => await readJsonFile(PLAYERS_PATH);
const coaches = async() => await readJsonFile(COACHES_PATH);
console.log(players());
console.log(coaches());
}
async
函数的结果总是Promise,所以您可以等待它。因为它返回一个Promise。promise的then
方法返回一个promise,该promise将根据调用它的promise发生了什么以及在提供它的回调中发生了什么来解析。类似地,async
函数总是返回一个承诺,该承诺被解析为函数中发生的事情。因此players()
(例如)返回一个承诺
不能同步使用异步调用的结果。您必须异步使用它
请注意,以下内容没有任何作用:
const players = async () => await readJsonFile(PLAYERS_PATH);
接
players();
只用
readJsonFile(PLAYERS_PATH);
直接的。例如(在async
函数中):
由于这在async
函数中,因此可以使用wait
等待该值。请注意,无论在最外层调用async
函数的是什么,它都必须处理这样一个事实,即它以异步方式工作,并且可能会失败(因此必须。然后和。catch
)。您没有等待console.log语句的输出,因此它们是在承诺得到解决之前触发的。尝试将console.log语句附加到。然后将链连接到调用异步函数的语句
就是,
players().then(console.log(players())代码>
不管这是否是最好的方法,您都会这样做。这是因为您正在为reachreadJsonFile
创建新的异步方法,而不是等待它们在登录之前解决。我想你可能想要的是:
const players = await readJsonFile(PLAYERS_PATH);
const coaches = await readJsonFile(COACHES_PATH);
如果要保留原始语法,则需要在记录它们之前使用await
。console.log(await players())
阅读其他帖子,异步函数总是返回一个承诺。@Angelaplayers()instanceof promise
const players = await readJsonFile(PLAYERS_PATH);
const coaches = await readJsonFile(COACHES_PATH);