Как обрабатывать асинхронные функции в Node.js

#javascript #node.js

#javascript #node.js

Вопрос:

Я использую Node для предварительной обработки .csv файлов в .json файл, для этого я использую CSVTOJSON пакет npm.

Я хочу дождаться завершения синтаксического анализа, а затем запустить процедуру загрузки в базу данных.

Я обнаружил, что Node требуется для связывания функций с обратными вызовами для их асинхронного выполнения.

Но я не могу понять, как применить к моей программе.

Вот код.

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

Комментарии:

1. Найдите обещания, ожидающие асинхронного ожидания. Это более управляемый способ кодирования

Ответ №1:

Существуют различные способы обработки асинхронной природы Javascript. Я буду использовать fs.readFile() в качестве примера, чтобы упростить задачу. Вот некоторые из подходов —

  1. Обратные вызовы — передача функции в качестве аргумента для вызова после выполнения асинхронной задачи.
 fs.readFile('./some-file.txt', (err, res) => {
  if (err) {                   // err is null if success
    return console.log(err);   // handle error
  }
  console.log(res);            // handle success
});
 
  1. Promises — это глобально доступный объект в Javascript для обработки асинхронных задач отложенным способом. Это также дает возможность связывать несколько обещаний.
 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            
});
 
  1. Async / Await — это более простой способ обработки обещаний, который был представлен в ES2017. Также обратите внимание, что Async / Await будет работать только с функциями, возвращающими обещание.
 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
  }
}
 

Дальнейшее чтение —

Комментарии:

1. Большое вам спасибо! Я очень ценю вас за ваш любезный ответ!