Как однократно инициализировать модуль узла данными из локального файла - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать модуль узла, который имеет некоторые вспомогательные функции для поиска справочных данных, которые у меня есть в файле 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 голосов
/ 07 февраля 2019

С комментарием @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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...