P.S. Вопрос может быть и похож на дубликат, но все же немного о другом.
Чисто визуально я вижу эффект как работает промис и как он передает результат \ ошибку в then. И вроде могу даже написать как надо. Однако не понимаю фразу "then тоже возвращает промис", а если точнее - не понимаю, как именно это происходит. Попробую объяснить на примерах, что именно не понятно.
Возьмем вот такой промис:
let prom = new Promise((resolve, reject) => {
resolve(5);
});
► Ситуация 1: есть обработчик
prom
.then(result => {
console.log(result);
});
Чисто визуально тут все как будто очевидно - в resolve мы передали результат 5, он сохранился в промисе. А тут мы передали промису функцию, которой этот результат нужен. Он эту функцию вызывает, передает ей 5 и на этом дело заканчивается. Здесь можно даже и не заподозрить, что then что-то возвращает.
► Ситуация 2: нет обработчика
prom
.then(null)
.then(result => {
console.log(result);
});
Вот тут уже интереснее. Появляется цепочка из then и становится очевидно, что then возвращает промис, т.к. на результате мы снова можем вызвать then. Но поскольку там null, можно подумать, что исходный промис просто как-то передается дальше.
► Ситуация 3: обработчик возвращает простое значение
prom
.then(result => {
return 10; // Вот это простое значение
})
.then((result) => {
console.log(result);
});
Еще интереснее - обработчик возвращает простое значение, которое моментально попадает в следующий then.
► Ситуация 4: обработчик возвращает промис
prom
.then(result => {
return new Promise((resolve, reject) => { // Вот этот промис
setTimeout(() => resolve(20), 2000);
});
})
.then(result => {
console.log(result);
});
Обработчик возвращает промис, результат которого через две секунды попадает в следующий обработчик.
► Ситуация 5, дополнительная: случай с ошибкой
prom
.then(result => {
throw new Error("Ошибочка вышла!");
})
.then(null, result => {
console.log(result.message);
});
Можете рассказать в общих чертах, если then возвращает промис, то как он его формирует? Вот на примерах этих ситуаций.