Создание обещания из нескольких асинхронных операций чтения файлов в узле?

1

Если у нас есть:

fn1() {
   [filepath1, filepath2, ..., filepathN].forEach(process);

   function process(path) {
       fs.readFile(file, translate);
   }
}

Обратный вызов translate - это то, что работает с содержимым каждого файла.

Как мы это сделаем, получим обещание, чтобы мы могли делать fn1().then(fn2)?

Если есть хорошее решение, использующее async await что это тоже здорово.

Предположения

  • fn2() должен ждать, пока все пути файла в массиве, используемом fn1, будут обработаны.
  • fn1(), вероятно, вернется, прежде чем все файлы будут обработаны, поскольку fs.readFile() является асинхронным... IIUC? '
Теги:

1 ответ

2
Лучший ответ

Вы можете использовать await внутри for..of цикла:

async fn1() {
  for (path of [filepath1, filepath2, ..., filepathN]) {
    await new Promise((resolve) => {
      fs.readFile(path, (err, data) => {
        translate(err, data);
        resolve();
      });
    });
  }
}

fn1, будучи асинхронной функцией, автоматически возвращает Promise, которая разрешается после завершения всех итераций, поэтому вы можете использовать fn1().then(fn2).

Если вы хотите readFile параллельно, а не последовательно, то лучше map на map каждый вызов readFile в массив обещаний, а затем использовать Promise.all:

fn1() {
  const arr = [filepath1, filepath2, ..., filepathN];
  return Promise.all(arr.map(path => new Promise((resolve) => {
    fs.readFile(path, (err, data) => {
      translate(err, data);
      resolve();
    });
  })));
}
  • 0
    СЛАДКИЙ - Это безумно хорошо - Спасибо!
  • 0
    этот парень сумасшедший гик :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню