为什么此箭头函数返回Promise {<pending>}

时间:2020-06-10 23:06:57

标签: javascript node.js json promise path

我正在努力将JSON文件读取到我的node.js代码中,但是在我的retrieveTeamData函数中,我在控制台输出中得到了Promise {}。最初,我没有在retrieveTeamData函数中使用async / await,但是我认为这将有助于防止promise在解决之前超时。

    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());
}

4 个答案:

答案 0 :(得分:3)

因为它返回了一个承诺。 Promise的then方法返回一个Promise,该Promise将根据您对它的调用发生的情况以及您提供的回调中发生的情况进行解析。同样,async函数始终返回一个promise,该承诺被解析为函数中发生的事情。因此players()(例如)返回了一个诺言。

您不能同步使用异步调用的结果。您必须异步使用它。


请注意,以下目的无济于事

const players = async () => await readJsonFile(PLAYERS_PATH);

之后

players();

只需使用

readJsonFile(PLAYERS_PATH);

直接。例如。 (在async函数中):

console.log(await readJsonFile(PLAYERS_PATH));

由于该函数位于async函数中,因此可以使用await等待该值。请注意,最外层的async函数必须调用来处理它异步执行工作并且可能会失败的事实(因此必须.then和{ {1}}。

答案 1 :(得分:2)

async函数的结果始终是Promise,因此您可以await使用它。

答案 2 :(得分:1)

您不是在等待console.log语句的输出,因此它们在承诺被解决之前就已启动。尝试将带有.then链的console.log语句附加到调用异步函数的语句上。

也就是说, players().then(console.log(players()));

不管这是否是最好的方法,这都是您要这样做的方式。

答案 3 :(得分:1)

这是因为您要创建新的异步方法来访问readJsonFile,而不是等待它们解析后再登录。我认为您可能想要的是:

const players = await readJsonFile(PLAYERS_PATH);
const coaches = await readJsonFile(COACHES_PATH);

如果要保留原始语法,则需要在登录之前使用await