如何使用本地文件中的数据一次性初始化节点模块

时间:2019-02-06 22:02:12

标签: node.js module initialization synchronization

我正在尝试创建一个具有一些帮助功能的节点模块,以搜索我在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数据。

1 个答案:

答案 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();