#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()
в качестве примера, чтобы упростить задачу. Вот некоторые из подходов —
- Обратные вызовы — передача функции в качестве аргумента для вызова после выполнения асинхронной задачи.
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
});
- 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
});
- 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
}
}
Дальнейшее чтение —
- Обратные вызовы — https://developer.mozilla.org/en-US/docs/Glossary/Callback_function
- Обещания — https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
- Асинхронный / Ожидающий — https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
Комментарии:
1. Большое вам спасибо! Я очень ценю вас за ваш любезный ответ!