Методы 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
может быть возвращаемой ошибкой. Почему нет?