Методы then и catch промисов в JS

Рейтинг: 0Ответов: 0Опубликовано: 11.02.2023

товарищи! Начал осваивать промисы. Есть вопросы к нюансам.

Есть задача: Записать строку text в файл pathFile1, считать данные из него, посчитать количество слов, полученный результат записать в файл pathFile2, удалить файл pathFile2.

Имеется такой код:

writeFileAsync(pathFile1, text)
  .then(() => readFileAsync(pathFile1))
  .then(data => data.split(' ').length) //????????
  .then(countOfWords => writeFileAsync(pathFile2, `Количество слов: ${String(countOfWords)}`))
  .then(() => removeFileAsync(pathFile1))
  .catch(err => console.log('Ошибка: ' + err));

Функции readFileAsync(), writeFileAsync() и removeFileAsync() выглядят примерно так:

const readFileAsync = async (path) => {
  return new Promise((resolve, reject) => {
    fs.readFile(path, {encoding: 'utf-8'}, (err, data) => {
      if (err) {
        return reject(err);
      }
      resolve(data);
    });
  });
}

Код работает как надо, но есть вопрос. Написанные мной асинхронные функции возвращают промис, и я понимаю, что в then() приходит позитивный результат промиса. Информацию брал здесь. Однако меня смущает связь 2-го и 3-го then() в цепочке. Я наткнулся на информацию, что then() и catch() всегда возвращают промис, но не понимаю, почему 3-й then() считает, что предыдущий промис завершился успешно? Ведь напрямую мы не используем функцию, в которой были бы указаны resolve и reject. В данном случае имееем просто код, разбивающий массив на элементы.

По-моему, если написать таким образом:

.catch(countOfWords => writeFileAsync(pathFile2, `Количество слов: ${String(countOfWords)}`))

то данный код также должен выполниться, поскольку countOfWords может быть возвращаемой ошибкой. Почему нет?

Ответы

Ответов пока нет.