Javascript 使用node.js中的异步等待函数读取csv文件。由于在承诺解决之前执行而未定义

Javascript 使用node.js中的异步等待函数读取csv文件。由于在承诺解决之前执行而未定义,javascript,node.js,asynchronous,promise,async-await,Javascript,Node.js,Asynchronous,Promise,Async Await,我正在用Node读取文件,过程分为4步。每个步骤都必须等待它调用的函数的解析。这似乎是一项非常简单的任务,但异步函数并不等待其变量定义的结果(即,即使变量“finish”依赖于等待异步函数的变量processData,它也会启动 如果我的结论不正确,我猜我对基本行为的理解很差。我知道有很多线程都有这个问题,但我希望能得到一些帮助。哦,如果我将fs.readFile方法的结果记录在其回调中,数据就会显示出来。但是数据是从该块返回的,没有定义。代码下: async function formatDa

我正在用Node读取文件,过程分为4步。每个步骤都必须等待它调用的函数的解析。这似乎是一项非常简单的任务,但异步函数并不等待其变量定义的结果(即,即使变量“finish”依赖于等待异步函数的变量processData,它也会启动

如果我的结论不正确,我猜我对基本行为的理解很差。我知道有很多线程都有这个问题,但我希望能得到一些帮助。哦,如果我将fs.readFile方法的结果记录在其回调中,数据就会显示出来。但是数据是从该块返回的,没有定义。代码下:

async function formatData(){ 
    const processData = await getFiles()
    const finish = await printData(processData)
}


async function getFiles(){
    const checkFile = await getFileData('./csvs/checkfile_for_node_test.csv')
    const scheduleFile = await getFileData('./csvs/schedules_for_node_test.csv')

    console.log('returning files')
    return {checks: checkFile, schedules: schedFile}
}

async function getFileData(file){
     const fileData = await fs.readFile(file, (err, data) => data ) 
     console.log(`file data: ${fileData}`)
     return fileData
}

function printData(data){
    console.log(data)
    return data
}

formatData()

我不知道您提供的代码是否是实际代码,但似乎有很多问题,我会逐一为您细分:

  • 调用
    formatData
    时,应在其前面使用
    wait
    关键字,因为它是一种
    async
    方法

  • getFiles
    方法的最后一行,您错误地放置了
    scheduleFile
    而不是
    scheduleFile

  • 您正试图将
    fs.readFile
    与await一起使用。它不能以这种方式工作。您必须提示它或使用
    readFileSync

  • 所有这些都放在代码中:

    async function formatData(){ 
        const processData = await getFiles()
        const finish = await printData(processData)
    }
    
    
    async function getFiles(){
        const checkFile = await getFileData('./csvs/checkfile_for_node_test.csv')
        const scheduleFile = await getFileData('./csvs/schedules_for_node_test.csv')
    
        console.log('returning files')
        return {checks: checkFile, schedules: scheduleFile}
    }
    
    async function getFileData(file){
         const readFileAsync = promisify(fs.readFile); 
         const fileData = await readFileAsync(file, { encoding: 'utf-8' });
         console.log(`file data: ${fileData}`)
         return fileData
    }
    
    function printData(data){
        console.log(data)
        return data
    }
    
    window.addEventListener('load', async function () {
       await formatData();
    });
    

    我希望它能起作用。

    我不知道您提供的代码是否是实际代码,但似乎存在很多问题。我将为您逐一细分:

  • 调用
    formatData
    时,应在其前面使用
    wait
    关键字,因为它是一种
    async
    方法

  • getFiles
    方法的最后一行,您错误地放置了
    scheduleFile
    而不是
    scheduleFile

  • 您正试图将
    fs.readFile
    与await一起使用。它不能以这种方式工作。您必须提示它或使用
    readFileSync

  • 所有这些都放在代码中:

    async function formatData(){ 
        const processData = await getFiles()
        const finish = await printData(processData)
    }
    
    
    async function getFiles(){
        const checkFile = await getFileData('./csvs/checkfile_for_node_test.csv')
        const scheduleFile = await getFileData('./csvs/schedules_for_node_test.csv')
    
        console.log('returning files')
        return {checks: checkFile, schedules: scheduleFile}
    }
    
    async function getFileData(file){
         const readFileAsync = promisify(fs.readFile); 
         const fileData = await readFileAsync(file, { encoding: 'utf-8' });
         console.log(`file data: ${fileData}`)
         return fileData
    }
    
    function printData(data){
        console.log(data)
        return data
    }
    
    window.addEventListener('load', async function () {
       await formatData();
    });
    

    我希望它能工作。

    我相信您缺少getFileData函数的承诺。下面是修改后的代码

    const fs = require("fs");
    
    async function formatData() {
      const processData = await getFiles();
      const finish = await printData(processData);
    
      console.log(finish);
    }
    
    async function getFiles() {
      const checkFile = await getFileData("./hello.txt");
      const scheduleFile = await getFileData("./world.txt");
    
      console.log("returning files");
      return { checks: checkFile, schedules: scheduleFile };
    }
    
    async function getFileData(file) {
      return new Promise((res, rej) => {
        fs.readFile(file, (err, data) => {
          if (err) rej(err);
          console.log(`file data: ${data}`);
          res({ fileData: data });
        });
      });
    
      return fileData;
    }
    
    async function printData(data) {
      console.log(data);
      return data;
    }
    
    formatData();
    

    我相信你错过了getFileData函数的承诺

    const fs = require("fs");
    
    async function formatData() {
      const processData = await getFiles();
      const finish = await printData(processData);
    
      console.log(finish);
    }
    
    async function getFiles() {
      const checkFile = await getFileData("./hello.txt");
      const scheduleFile = await getFileData("./world.txt");
    
      console.log("returning files");
      return { checks: checkFile, schedules: scheduleFile };
    }
    
    async function getFileData(file) {
      return new Promise((res, rej) => {
        fs.readFile(file, (err, data) => {
          if (err) rej(err);
          console.log(`file data: ${data}`);
          res({ fileData: data });
        });
      });
    
      return fileData;
    }
    
    async function printData(data) {
      console.log(data);
      return data;
    }
    
    formatData();
    

    您正在
    printData
    上运行
    await
    ,该函数不是
    async
    函数。请将其设置为async并进行检查。您也可以简单地从printData调用中删除async。您使用的是
    readFile
    的函数吗?它看起来不是这样的,在这种情况下,
    await fs.readFile(…)
    不会做你希望做的事。所以你在日志中得到了
    文件数据:未定义的
    ,对吗?这是正确的。下面的用户已解决。你正在运行
    等待
    打印数据这不是
    异步
    函数。请将其设为异步并检查。你也可以简单地从printData调用中删除异步。你使用的是函数吗de>readFile?它看起来不是那样的,在这种情况下,
    等待fs。readFile(…)
    不会做你希望做的事。所以你在日志中得到
    文件数据:未定义的
    ,对吗?没错。下面的用户已解决。别忘了把
    解决()
    调用
    else
    语句谢谢,@Bergi,我只是在上面的代码中将resolve重命名为res。它仍然不正确吗?不,它不正确。即使出现错误,您仍然在调用
    控制台.log
    resolve
    。不要忘记放置
    resolve()
    调用
    else
    语句谢谢,@Bergi,我只是在上面的代码中将解析重命名为res。它仍然不正确吗?不,它不正确。即使有错误,您仍然在调用
    控制台.log
    res
    语句。4.
    打印数据
    是同步的,没有理由等待
    解析调用“当您调用
    formatData
    时,您应该使用
    await
    关键字”-不一定,它似乎是顶级调用。更重要的是使用
    formatData().catch(console.error)处理来自它的错误
    .Btw,这是node.js代码,它没有
    窗口
    ,也没有
    加载
    事件可监听。4.
    打印数据
    是同步的,没有理由
    等待
    调用“当您调用
    格式数据
    时,您应该使用
    等待
    关键字”-不一定,它似乎是顶级调用。更重要的是使用
    formatData().catch(console.error)
    ,处理来自它的错误。顺便说一句,这是node.js代码,它没有
    窗口
    ,也没有
    加载
    事件可侦听。