Метод then () возвращает Promise. См. Документы .
У обещания есть метод-обработчик.Как только Обещание выполнено или отклонено, соответствующая функция-обработчик будет вызываться асинхронно.Поведение функции-обработчика следует определенному набору правил , как указано здесь .
Давайте рассмотрим их одно за другим.Вот код, который мы будем проверять рядом.Ничего особенного, просто цепочка обещаний, возвращающих значения.
let sequence = new Promise(function (resolve) {
console.log('Say 1')
resolve(1)
})
sequence
.then(() => {
console.log('Say 2')
return 2
})
.then(() => {
console.log('Say 3')
})
.then(() => {
console.log('Say 4')
return Promise.resolve(4)
})
.then(() => {
return new Promise(function (resolve) {
console.log('Say 5')
setTimeout(() => { resolve(5) }, 1000)
})
})
- возвращает значение, обещание, возвращаемое затем, разрешается с возвращенным значением в качестве значения;
В коде это Say 2
, и ваш оригинальный вопрос.Когда возвращается значение, then()
возвращает Обещание, которое разрешается значением, которое вы вернули.
ничего не возвращает, обещание, возвращаемое к тому времени, разрешается с неопределенным значением;
как указано выше.
выдает ошибку, обещание, возвращаемое потом, отклоняется с брошенной ошибкой в качестве значения;
, как указано выше, за исключением того, что теперь then()
возвращает обещание, которое было отклонено сваша ошибка.
возвращает уже выполненное обещание, а возвращенное обещание разрешается со значением этого обещания в качестве его значения;
В коде это Say 4
, где обещание уже былорешена.Так что теперь then()
возвращает Обещание, которое разрешается со значением 4.
возвращает уже отклоненное обещание, а возвращенное обещание отклоняется со значением этого обещания в качестве его значения;
, как указано выше, за исключением того, что теперь оно отклоняется.
возвращает другой объект ожидания обещания, разрешение / отклонение обещания, возвращенного к тому времени, будет следовать за разрешением / отклонением обещания, возвращенного обработчиком.Кроме того, значение обещания, возвращенного к тому времени, будет таким же, как и значение обещания, возвращенного обработчиком.
В коде это Say 5
.Если вы вернете обещание, которое еще не выполнено, then()
вернет Обещание с результатами вашего обещания, т. Е. 5.
Одна вещь, на которую следует обратить внимание, что я также недавно узнал (предложено @Bergiв комментариях) метод then()
всегда создает и возвращает новое Promise до того, как обратные вызовы цепочки даже начали выполняться.Обратные вызовы, которые вы передаете then()
, просто сообщают обещанию значение / ошибку, с которой обещание должно быть разрешено / отклонено.
В итоге, поэтому then()
цепочка работает, даже если вы специально этого не делаетевернуть новое обещание - потому что метод then()
всегда создает новое обещание за кулисами и отклоняет / разрешает это обещание с возвращенным значением.Наиболее сложный случай в приведенных выше сценариях - это когда вы возвращаете обещание в вашем обратном вызове, и в этом случае результаты вашего обещания обратного вызова передаются в обещание then()
.