我是 Javascript 和 NodeJS 的新手。我試圖在對它們進行一些處理之前讀取多個 CSV 檔案。我當前的問題是當我運行代碼時,它會在檔案讀取完成之前嘗試執行處理。我想在開始對它們進行任何處理之前加載這兩個 CSV。
有人可以解釋為什么會發生這種情況以及我如何解決 Javascript/NodeJS 中的問題。
function readCSV(path){
var events = []
fs.createReadStream(path).pipe(csv()).on('data', (row) => {
events.push(row);
}).on('end', () => {
console.log('CSV file successfully processed. Length: ' events.length);
});
return events
}
function app(){
var file_list = listFiles(folder_path);
for (let i = 0; i < file_list.length; i ) {
const file = file_list[i];
var events = readCSV(file)
}
processCSV(events) // Some processing
}
app();
任何幫助都會很棒,任何關于我如何控制代碼執行時間的解釋都將不勝感激。
uj5u.com熱心網友回復:
抱歉,您的代碼無法編譯,因此只能使用未經測驗的代碼來回答
我當前的問題是當我運行代碼時,它會在檔案讀取完成之前嘗試執行處理。
fs.createReadStream不讀取檔案的主要問題, - 它請求檔案系統開始讀取并在讀取某些塊時通知您的回呼,因此稍后將呼叫事件“結束”匹配,何時readCSV完成并回傳空結果
您撰寫的代碼就像您期望同步答案一樣,并且您可以使用同步方法使其正常作業,例如 fs.readFileSync
如何以異步方式修復它?在“on(end)”回呼或使用承諾中撰寫 csv 處理
Promises 匹配更簡單和線性
首先使 readCSV 回傳 Promise
function readCSV(path: string){ //return Promise<any[]>
return new Promise((resolve) => {
var events = [];
fs.createReadStream(path)
.pipe(csv())
.on('data', (row) => {
// this code called in future
events.push(row);
}).on('end', () => {
// this code called in future to,
console.log('CSV file successfully processed. Length: ' events.length);
resolve(events); //return csv parsed result
});
})
}
然后在主應用程式中,使用 Promise.all 等待所有 fileReading 承諾
function app(){
// i don't know what is listFiles,
// i hope it returns sync result
var file_list = fs.listFiles(folder_path);
const dataPromises: Promise[] = []
for (let i = 0; i < file_list.length; i ) {
const file = file_list[i];
//launch reading
dataPromises.push(readCSV(file))
}
Promise.all(dataPromises).then(result => {
//this code will be called in future after all readCSV Promises call resolve(..)
for(const events of result){
processCSV(events);
}
})
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318790.html
標籤:javascript 节点.js 文件 异步 FS
