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

Javascript NodeJS使用module.exports导出异步变量,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我在nodejs应用程序中有2个文件: export.js(逐行读取文件并将其保存到数组中) 和app.js(应该得到导出的值,这样我就可以在这里玩了) 正如您在export.js中看到的,我使用了一个异步回调,因此它将保存数据,但我认为我需要在app.js文件中使用另一个异步回调。实现这一目标的最佳方式是什么 另外,我意识到对export.js文件的异步调用是不必要的。以下是新版本: var lineReader = require('readline').createInterface({

我在nodejs应用程序中有2个文件:

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

app.js(应该得到导出的值,这样我就可以在这里玩了)

正如您在export.js中看到的,我使用了一个异步回调,因此它将保存数据,但我认为我需要在app.js文件中使用另一个异步回调。实现这一目标的最佳方式是什么

另外,我意识到对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文件中a变量的值?

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

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) })
然后

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

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

您还可以导出承诺,而不是回调:

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
    })

要获得承诺,您可以使用
npm i bluebird

安装bluebird,而不是回调,您还可以导出承诺

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
    })

为了得到承诺,您可以使用
npm i bluebird

安装bluebird,这可能有点太实际了,但为什么不同步阅读
test.txt
,将内容拆分成行,然后导出这些内容呢?是的,这也应该有效。:)也许有点太实际了,但为什么不同步读取
test.txt
,将内容拆分成行,然后导出这些行呢?是的,这也应该有效。:)非常感谢。你能为其他读者添加一些解释吗?:)我不知道怎么解释,很简单。只导出带有回调参数的函数。@Maxx这里您当然可以解释一些事情,例如,为什么尝试同步导出异步函数的结果会出现问题,以及导出带有回调的函数如何解决这些问题。谢谢。你能为其他读者添加一些解释吗?:)我不知道怎么解释,很简单。只导出带有回调参数的函数。@Maxx在这里您当然可以解释一些事情,例如,为什么尝试同步导出异步函数的结果会出现问题,以及导出带有回调的函数如何解决这些问题。