#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
можно записать