最简单的解决方案可能是在添加一些await
之后再使用一些promise pattern,或者重新使用...
我不知道如何重新使用 Promise,我假设它已经存在于方法csv-parse.readFileSync()
或方法parse()
中,如下所示。
另一种解决方案是添加更多的Promise和一些 async / await :整个LOAD块可以是一个函数...但是我也看不到将awaits放在哪里
'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?
答案 0 :(得分:0)
csv-parse根据https://csv.js.org/parse/api/#sync-api
提供了一个同步API我猜想使用此方法可以解决您要避免的整个promise / callback麻烦
答案 1 :(得分:0)
这是一个解决方法,不是使用例如await
。
(请编辑此答案,它是一个Wiki,您可以更正我的假设,英语或添加线索和链接)
似乎唯一的解决方案是丑陋的幼稚解决方案,将所有软件封装在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!!");
}
我真正需要的是承诺的未记录名称,以便于所有人等待。参见the problem
答案 2 :(得分:0)
您正在以同步模式读取文件,但是正在以异步模式进行解析。如前所述,要在同步模式下使用解析器,必须要求initialX
使用CSV parse sync API。
在GitHub上查看我的答案,其中包括一个示例。