0

Нужно считать файл построчно, каждую строку запихнуть в массив как очередной элемент. Далее выбирается рандомный элемент из полученного массива и экспортируется для употребления в синхронном коде.

Есть некоторый рабочий код (ниже), но он АСИНХРОННЫЙ, и он тупиковый - ничего не вытащищь наружу и не экспортируешь. А существует ли обычный метод? Или как сделать код ниже синхронным? Заранее спасибо!

function fileToArray(Object_) {
    return new Promise((resolve, reject) => {
        const rl = readline.createInterface({
            input: fs.createReadStream(Object_.file),
            crlfDelay: Infinity
        });
        rl.on('line', line => Object_.array.push(line));
        rl.on('close', () => resolve(Object_.array));
        rl.on('error', err => reject(err))
    });
}
nörbörnën
  • 12,192
  • 5
  • 29
  • 40
svegger
  • 29
  • 3

2 Answers2

2

Если файл небольшой, можно так:

const lines = fs.readFileSync('./file.txt', 'utf8').split(/\r?\n/);
vsemozhebuty
  • 14,042
2

Есть некоторый рабочий код (ниже), но он АСИНХРОННЫЙ, и он тупиковый - ничего не вытащищь наружу и не экспортируешь.

Суждение о том, что код "тупиковый", - абсолютно неверное суждение, обусловленное незнанием базовых практик.

С вашим асинхронным построчным чтением файла очень легко работать:

const fs = require('fs');
const path = require('path');
const readline = require('readline');

{ // callback version const filepath = path.join(__dirname, 'data.txt'); fileToArray(filepath).then((arr) => console.log('cb', arr)).catch(console.error); }

(async () => { // async version const filepath = path.join(__dirname, 'data.txt'); const arr = await fileToArray(filepath); console.log('async', arr); })();

async function fileToArray(filepath) { const input = fs.createReadStream(filepath);

const res = await new Promise((resolve, reject) => { const strings = []; const rl = readline.createInterface({ input, crlfDelay: Infinity }); rl.on('line', (line) => strings.push(line)); rl.once('close', () => resolve(strings)); rl.once('error', (err) => reject(err)); });

return res; }

Вывод в терминал:

[
  '[',        '{"a":1},',
  '{"b":1},', '{"c":1},',
  '{"d":1},', '{"e":1},',
  '{"f":1},', '{"j":1},',
  '{"h":1},', '{"i":1}',
  ']'
]
nörbörnën
  • 12,192
  • 5
  • 29
  • 40