Чтение файлов последовательно с fs.readFile в Node? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть произвольное число путей к файлам, которые хранятся в массиве в виде строк.

Мне нужно прочитать эти файлы последовательно (т.е. закончить чтение одного файла перед началом чтения следующего) и вывести длину файлапосле прочтения каждого файла.И после окончания чтения всех файлов выведите 'done'.

Мне разрешено использовать только fs.readFile и собственный Javascript.Нет fs.readFileSync или любой другой модуль не допускается.Кроме того, я на Node v6, поэтому я не могу использовать async / await.

Есть ли способ реализовать функциональность, следуя ограничениям?

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Попробуйте использовать generators.В примере кода замените функцию acync на чтение файлов.

// emulate async action
const stt = (resolve, str) => {
  setTimeout(
    () => {
      console.log(str);
      resolve(str);
    },
    2000
  );
}
// Create array of functions that return Promise
const arrFunc = ['foo', 'bar', 'baz', 'qux']
  .reduce(
    (acc, str) => {
      acc.push(() => {
        return new Promise(resolve => {
          stt(resolve, str);
        });
      });
      return acc;
    }, []
  );

function* generator() {
  for (let func of arrFunc) {
    yield func();
  }
}

const iterator = generator();

function quasiCo(generator, value) {
  const next = generator.next();
  console.log(next);
  if (!next.done) {
    next.value.then(res => {
      quasiCo(generator, res);
    });
  }
}

quasiCo(iterator);
0 голосов
/ 18 декабря 2018

Вам не нужны никакие причудливые вещи, такие как обещания, асинхронность / ожидание, генераторы, чтобы достичь этого.

function readAllFiles(list) {
  if(list.length == 0) return
  console.log('reading ', list[0])
  return fs.readFile(list[0], function (err, file) {
    if (err) console.error(err); // report the error and continue
    console.log('list[0]' length:', file.length); // report the file length
    readAllFiles(list.slice(1, list.length))
  })
}

var l = ['1', 'foo', 'bar']

readAllFiles(l)
0 голосов
/ 18 декабря 2018

Чтение файлов синхронно с fs.readFile в узле?

Нет.

Асинхронные функции асинхронны.

Их нельзя включитьв синхронные функции.

Даже если бы вы могли использовать await (что вы исключили), он все равно был бы асинхронным только с синтаксисом, позволяющим писать код в синхронном стиле в более широком контексте, который все еще асинхронный.

Большая часть JavaScript является асинхронной.Прими это.Постарайтесь использовать обещания.Не пытайтесь бороться с этим.

Мне нужно последовательно прочитать эти файлы (т.е. закончить чтение одного файла перед началом чтения следующего) и выводить длину файла после каждого чтения файла.И после завершения чтения всех файлов выведите «done».

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

...