Emptyform
@Emptyform

Как правильно работать с промисами в этом примере?

Есть код который считает размер всех файлов в текущей папке:
'use strict';

const fs = require('mz/fs');

fs.readdir(__dirname)
  .then(function(filesNames) {
    return Promise.all(
      filesNames.map(fileName => fs.stat(fileName))
    )
  })
  .then(function(stats) {
    return stats.filter(stat => stat.isFile())
  })
  .then(function(stats) {
    return stats.reduce((sum, stat) => sum + stat.size, 0)
  })
  .then(console.log);

А что если нам после проверки stat.isFile() нужно выполнить разные манипуляции с содержимым файла? Т.е. нужно выполнить fs.readFile(), а имя файла мы уже потеряли.
Как это сделать?
  • Вопрос задан
  • 255 просмотров
Решения вопроса 1
Emptyform
@Emptyform Автор вопроса
Решение:
'use strict';

const fs = require('mz/fs');

fs.readdir(__dirname)
  .then(filesNames => Promise.all(
      filesNames.map(fileName => {
          return fs.stat(fileName).then(stat => {
              return {name: fileName, stat: stat};
          });
      })
    )
  )
  .then(stats => stats.filter(
    statsObj => statsObj.stat.isFile()
  ))
  .then(stats => stats.reduce(
    (sum, statsObj) => {
      console.log(`${statsObj.name}: ${statsObj.stat.size}`);
      return sum + statsObj.stat.size;
    }, 0
  ))
  .then(console.log)
  .catch(error => console.log(error));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vshvydky
Emptyform а вы вообще о промисах читали?
Вы в then передаете через resolve То что вам надо, в reject то что надо отправиль в catch
в вашем случае в resolve передается результат filesNames.map(fileName => fs.stat(fileName))
Обратитесь к документации по JS
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы