我正在尝试创建一个具有一些帮助功能的节点模块,以搜索我在CSV文件中拥有的参考数据。我已经使用csv-parser模块将其加载到对象中,并且此API似乎适用于异步流读取器/管道情况。我不希望在此参考数据有机会加载之前,该模块中的帮助程序功能可用于任何其他模块。
我曾经尝试使用Promise,但是为了使其能够正常工作,我不得不将该诺言和初始化函数暴露给调用模块,这并不理想。
// refdata.js
const fs = require('fs');
const csv = require('csv-parser');
var theData = new Array();
function initRefdata() {
return(new Promise(function(resolve, reject) {
fs.createReadStream('refdata.csv')
.pipe(csv())
.on('data', function(data) {theData.push(data);})
.on('end', resolve);}));
}
function helperFunction1(arg) { ... }
module.exports.initRefdata = initRefdata;
module.exports.helperFunction1 = helperFunction1;
// main.js
var refdata = require('./refdata.js');
function doWork() {
console.log(refdata.helperFunction1('Italy'));
}
refdata.initRefdata().then(doWork);
这对于引用数据模块的这种使用有效,但是令人沮丧的是,我无法在refdata.js的内部完全使用初始化函数。当我这样做时,在开始使用辅助函数之前,对流管道的异步调用尚未完成,该函数需要所有数据才能有用。另外,我不想每次都需要重新加载所有CSV数据。
答案 0 :(得分:0)
有了@Deepal的评论,我得以提出:
// refdata.js
const fs = require('fs');
const csv = require('csv-parser');
var theData = new Array();
function initRefdata() {
return(new Promise(function(resolve, reject) {
fs.createReadStream('refdata.csv')
.pipe(csv())
.on('data', function(data) {theData.push(data);})
.on('end', resolve);}));
}
function helperFunction1(arg) {
if (theData.length == 0) {
initRefdata().then(nestedHelper(arg));
}
else {
nestedHelper(arg);
}
function nestedHelper(arg) { ... }
}
module.exports.helperFunction1 = helperFunction1;
// main.js
var refdata = require('./refdata.js');
function doWork() {
console.log(refdata.helperFunction1('Italy'));
}
doWork();