NodeJS экспортирует асинхронную переменную с помощью module.exports

#javascript #node.js #asynchronous

#javascript #node.js #асинхронный

Вопрос:

У меня есть 2 файла в приложении nodejs:

export.js (читает файл построчно и сохраняет его в массив)

 var lineReader = require('readline').createInterface({
  input: require('fs').createReadStream('test.txt')
});
var file_lines = [];

onFinish(function(result) {
    module.exports = resu<
});

function onFinish(callback){
    lineReader.on('line', function (line) {

        file_lines.push(line);

    }).on('close', function() {
        callback(file_lines);
    })
};
  

и app.js (должен получить экспортированные значения, чтобы я мог поиграть с ним здесь)

 var a = require("./export");

console.log(a);
  

Как вы можете видеть в export.js Я использовал асинхронный обратный вызов, чтобы сохранить данные, но я думаю, что мне понадобится еще один асинхронный обратный вызов в app.js досье. Каков наилучший способ добиться этого?

PS Я понял, что асинхронный вызов для export.js файл не нужен. Вот новая версия:

 var lineReader = require('readline').createInterface({
  input: require('fs').createReadStream('test.txt')
});
var file_lines = [];

lineReader.on('line', function (line) {

    file_lines.push(line);

}).on('close', function() {
    module.exports = file_lines;
    console.log(file_lines);
})
  

Но опять же, мой вопрос будет заключаться в том, как мне получить значения в переменной a в app.js файл?

Комментарии:

1. Возможно, это слишком прагматично, но почему бы просто не читать test.txt синхронно, разбивать содержимое на строки и экспортировать их?

2. Да, это тоже должно сработать. 🙂

Ответ №1:

 var lineReader = require('readline').createInterface({
  input: require('fs').createReadStream('test.txt')
});
var file_lines = [];

module.exports = function onFinish(callback){
    lineReader.on('line', function (line) {

        file_lines.push(line);

    }).on('close', function() {
        callback(file_lines);
    })
};
  

и затем

 var a = require("./export");

a(function(data){ console.log(data) })
  

Комментарии:

1. Спасибо. Можете ли вы добавить несколько комментариев для объяснения для других читателей? 🙂

2. Я не знаю, как это объяснить, это очень просто. Просто экспортируйте функцию с аргументом обратного вызова.

3. @Maxx здесь, безусловно, есть вещи, которые вы можете объяснить, например, почему существует проблема с попыткой синхронного экспорта результата асинхронной функции и как экспорт функции, выполняющей обратный вызов, позволяет обойти это.

Ответ №2:

Вместо обратного вызова вы также можете экспортировать обещание:

 var Promise = require('bluebird')

var lineReader = require('readline').createInterface({
    input: require('fs').createReadStream('test.txt')
});

module.exports = function (user) {
    return new Promise(function (resolve, reject) {
        var file_lines = [];

        lineReader.on('line', function (line) {

        file_lines.push(line);

        }).on('close', function() {
            resolve(file_lines);
        })

    })
}
  

Затем используйте его красиво, вот так:

 read_lines = require('line_reader')

read_lines()
    .then(function (lines) {
        // lines are already read here
    })
  

чтобы получить обещание, вы можете установить bluebird с npm i bluebird

Ответ №3:

Вы можете экспортировать функцию lineReader и установить onFinish в качестве функции обратного вызова, где console.log можно записать