最简单的解决方案await
可能是在添加一些承诺模式或重用
...我不明白如何将 Promise(我认为它已经存在)重用到方法 csv-parse.readFileSync()
或方法parse()
中,如下所示。
另一种解决方案是添加更多的承诺和一些异步/等待:整个 LOAD 块可以是一个函数......但我也不明白等待的地方。
'use strict';
const fs = require('fs')
const path = require('path')
// CONFIGS:
const cf_cover_dataset = '../data/cover.csv'
var COVER = null;
// LOAD external configs:
var COVER_file = path.resolve(__dirname, cf_cover_dataset);
if (path.extname(cf_cover_dataset)=='.csv') {
const parse = require('csv-parse') // npm i csv-parse (not parse"r")
let raw = []
parse(fs.readFileSync( COVER_file ), {
trim: true,
skip_empty_lines: true
})
.on('readable', function(){
let record
while (record = this.read()){
raw.push(record) ; console.log('.')}
})
.on('error', function(err){ console.error(err.message) })
.on('end', function(){
// I NEED TO WAY THE END HERE, HOW TO?
COVER = f(raw);
console.log("1. cover from CSV");
});
} else {
COVER = JSON.parse(COVER_file) // ... and WAY here
console.log("1. cover from JSON");
}
console.log("2. END!!");
结果是
2. END!!
1. cover from JSON
如何在步骤1之后获得步骤2?
这更是一种解决方法,而不是使用例如 await
.
(请编辑这个答案,这是一个维基,你可以纠正我的假设,我的英语,或者添加线索和链接)
似乎唯一的解决方案是丑陋的幼稚解决方案,将所有软件封装在一个main()
函数中:
if (path.extname(cf_cover_dataset)=='.csv') {
...
parse(fs.readFileSync( COVER_file ), {
...
})
.on('readable', function(){
...
})
.on('error', function(err){ ... })
.on('end', function(){
COVER = f(raw);
console.log("1. cover from CSV");
main();
});
} else {
COVER = JSON.parse(COVER_file) // ... and WAY here
console.log("1. cover from JSON");
main();
}
function main() { // step2, ugly but run in sequence
console.log("2. END!!");
}
我真正需要的是承诺的无记录名称,以便于等待所有人。请参阅问题<</p>
csv-parse 根据 https://csv.js.org/parse/api/#sync-api 提供同步 API
我想使用它可以解决您想要避免的整个承诺/回调麻烦
您正在同步模式下读取文件,但在异步模式下解析。若要在同步模式下使用分析器(如前所述),必须要求csv-parse/lib/sync
使用 CSV 分析同步 API。
请参阅我在GitHub上的答案,其中包括一个示例。