Методы then и catch промисов в JS
товарищи! Начал осваивать промисы. Есть вопросы к нюансам.
Есть задача: Записать строку 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 может быть возвращаемой ошибкой. Почему нет?