NodeJS使用module.exports导出异步变量

时间:2016-10-07 08:24:43

标签: javascript node.js asynchronous

我在nodejs app中有2个文件:

export.js (逐行读取文件并将其保存到数组中)

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

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

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 中看到的,我使用了异步回调,因此它会保存数据,但我想我需要在应用中进行另一次异步回调。 js 文件。实现这一目标的最佳方法是什么?

P.S。我意识到不需要对 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);
})

但同样,我的问题是,如何在 app.js 文件中的变量中获取值?

3 个答案:

答案 0 :(得分:3)

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)

您还可以导出承诺

,而不是回调
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
    })

获取Promise,您可以使用npm i bluebird

安装bluebird

答案 2 :(得分:0)

您可以导出函数lineReader并将onFinish设置为console.log可以写入的回调函数