Javascript 如何在Node.js中处理异步函数

Javascript 如何在Node.js中处理异步函数,javascript,node.js,Javascript,Node.js,我使用Node将.csv文件预处理为.json文件,为此我使用CSVTOJSONnpm包 我想等待解析完成,然后启动上传到数据库的过程 我发现节点需要将函数与回调链接起来,以便异步执行它们 但我不知道如何应用到我的程序中 这是代码 // 1. Read *.csv file + Parse fields and escape; @dir "raw_data" => @dir "processed" fs.readdir(rawDataPath, f

我使用Node将
.csv
文件预处理为
.json
文件,为此我使用
CSVTOJSON
npm包

我想等待解析完成,然后启动上传到数据库的过程

我发现节点需要将函数与回调链接起来,以便异步执行它们

但我不知道如何应用到我的程序中

这是代码

// 1. Read *.csv file + Parse fields and escape; @dir "raw_data" =>  @dir "processed"
fs.readdir(rawDataPath, function (err, files) {
  if (err) return console.log("Unable to scan raw_data : " + err);

  console.log("Processing csv files to JSON...");
  console.log("+++++++++++++++++++++++++++++++++++++++++++++++++++++++");

  files.forEach(function (file) {
    console.log(`CSV ${file.split(".")[0]} being converted...`);

    csv({ ignoreEmpty: true })
      .fromFile("raw_data/" + file)
      .then((jsonObj) => {
        // stringify JSON Object
        var jsonContent = JSON.stringify(jsonObj);

        fs.writeFile(
          `processed_data/${file.split(".")[0]}.json`,
          jsonContent,
          "utf8",
          function (err) {
            if (err) {
              console.log(
                "An error occured while writing JSON Object to File."
              );
              return console.log(err);
            }

            console.log(
              `${file} successfully converted to ${file.split(".")[0]}.json`
            );
          }
        );
      });
  });
});

// 2. Upload to Cloud Firestore
fs.readdir(processedDataPath, function (err, files) {
  if (err) return console.log("Unable to scan processed_data : " + err);

  files.forEach(function (file) {
    var quiz = require("./processed_data/" + file);

    console.log(`Collection ${file.split(".")[0]} being updated...`);

    quiz.forEach(function (obj) {
      firestore
        .collection(`${file.split(".")[0].toUpperCase()}`)
        .doc(obj.id)
        .set(obj)
        .then(function (docRef) {
          console.log(
            `Document ${obj.id} successfully uploaded to Cloud Firestore!`
          );
        })
        .catch(function (error) {
          console.error("Error adding document: ", error);
        });
    });
  });
});

有多种方法可以处理Javascript的异步特性。我将使用
fs.readFile()
作为一个简单的示例。这些是一些方法-

  • 回调-将函数作为参数传递,以便在异步任务完成后调用
  • 承诺-这是Javascript中全局可用的对象,用于以延迟方式处理异步任务。它还提供了链接多个承诺的功能
  • 锁链-

    fs.promises.readFile('./some-1.txt').then((res) => {
      return fs.promises.readFile('./some-2.txt');            
      // handle success - 1
    }).then((res) => {
      return fs.promises.readFile('./some-3.txt');            
      // handle success - 2
    }).then((res) => {            
      // handle success - 3
    }).catch((err) => { 
      console.log(err);
      // handle error            
    });
    
  • Async/Await-这是一种更容易处理承诺的方法,在ES2017中引入。另外,请注意,Async/Await将仅适用于承诺返回函数
  • 进一步阅读-

    • 回调-
    • 承诺-
    • 异步/等待-

    查找承诺,异步等待。是一种更易于管理的编码方式!谢谢你的建议!非常感谢你!非常感谢您的友好回复!
    fs.promises.readFile('./some-file.txt').then((res) => {
      console.log(res);            // handle success
    }).catch((err) => {            // only gets executed if there is an error
      console.log(err);            // handle error
    });
    
    fs.promises.readFile('./some-1.txt').then((res) => {
      return fs.promises.readFile('./some-2.txt');            
      // handle success - 1
    }).then((res) => {
      return fs.promises.readFile('./some-3.txt');            
      // handle success - 2
    }).then((res) => {            
      // handle success - 3
    }).catch((err) => { 
      console.log(err);
      // handle error            
    });
    
    const main = async () => {
      try {
        const res = await fs.promises.readFile('./some-file.txt');
        console.log(res)
        // handle success
      } catch(err) {
        console.log(err);
        // handle error
      }
    }