Им действительно трудно понять цепочку промисов

(Кажется, я усвоил это, это то, что .then возвращает промис, даже если он не запущен, я никогда этого не знал, спасибо)

Пожалуйста, простите меня, если это глупый вопрос, но я просто не понимаю, я гуглил это много раз, но в этих статьях очень кратко говорится о Promise, например, как его создать, как решить, как .then и прочее .

Я запутался в цепочке обещаний.

Это мой код:

    let p = new Promise(function (resolve, reject){
    
    let value = 19;
    
    if(!value){
        resolve(value)
    } else {
        reject(value)
    }
})

p.then(x => {console.log(x*x); throw false})
    .then(null, x => console.log(x))
//19

Этот код печатает 19, и я понятия не имею, почему?

Я знаю, что каждый .then возвращает промис, но в этом случае p.then даже не должен был запускаться, потому что промис не разрешен. Теперь в каком-то смысле кажется, что это не сработало, но если так, то почему сработало второе .then?

Наш первый .then не выполнялся, он не выполнял никаких обещаний, поэтому ничего не должно было отображаться.

Теперь, если 2-й .then не работает так же, как p.then(), что, я надеюсь, не работает, потому что это только создаст больше путаницы, я не понимаю, почему 2-й .then будет работать?.

Извините еще раз, если мой вопрос или английский плохой, но мне действительно любопытно об этом.


person imheretolearn1    schedule 10.04.2021    source источник


Ответы (2)


Обещание может находиться в одном из следующих состояний:

pending -> исходное состояние, ни выполнено, ни отклонено.

выполнено -> операция успешно завершена.

отклонено -› операция не удалась.

В вашем примере кода обещание отклоняется (поскольку если значение является истинным условием). Метод then принимает два аргумента:

  p.then(onFulfilled[, onRejected]);

  p.then(value => {
     // fulfillment
  }, reason => {
   // rejection
  });

Так как then является цепным, отклонение запускается во втором цепочке, тогда это строка кода:

x => console.log(x)

Следовательно, печатая значение 19.

person Ran Turner    schedule 10.04.2021
comment
Большое спасибо за ваш ответ. Но где я использую здесь второй аргумент? p.then(x => {console.log(x*x); throw false}) Здесь я использую только один аргумент, который следует запускать только в том случае, если обещание разрешается, поскольку мое обещание отклоняется, это не должно было выполняться ? - person imheretolearn1; 10.04.2021
comment
Во втором тогда. Оно приковано к нему. - person Ran Turner; 10.04.2021
comment
.then(null, x => console.log(x)) - person Ran Turner; 10.04.2021

Функция .then принимает в качестве параметров две функции, одна из которых вызывается при разрешении промиса, а другая — при его отклонении. Он возвращает новое обещание, которое разрешается или отклоняется с любым значением, которое функция, которая была выполнена, возвращает (или бросает). Если ни один обработчик не был выполнен, обещание просто разрешается или отклоняется с тем же значением, для которого было вызвано обещание .then.

В вашем примере первый вызов .then получил только один аргумент, и поскольку обещание отклоняется, оно не будет выполнено. Следовательно, обещание, которое он возвращает, также будет отклонено, и, таким образом, будет выполнен второй аргумент.

 // some examples
 Promise.resolve()
   .then(called, notCalled);

 Promise.reject()
   .then(notCalled, called);

 Promise.resolve(1)
    .then(null, notCalled)
    .then(it => it + 1, notCalled)
    .then(called, notCalled);

 Promise.reject(1)
   .then(notCalled, null)
   .then(notCalled, it => it + 1)
   .then(called, notCalled);

 
person Jonas Wilms    schedule 10.04.2021
comment
Большое спасибо за ваш ответ, так что .then/.catch вернет обещание, даже если оно не будет запущено? Как вы сказали, я нажимаю только один аргумент в p.then, который должен быть запущен, если обещание разрешается, в моем случае оно отклонено, поэтому это не должно было выполняться. Или это то, что я сказал, .then вернет обещание, даже если оно не запустится? - person imheretolearn1; 10.04.2021
comment
Да, .then всегда возвращает новое обещание. - person Jonas Wilms; 10.04.2021
comment
Я никогда не знал, что даже если .then не запущен, он все равно возвращает обещание. Большое спасибо за это. Я прочитал так много статей, и все они говорили только кратко. - person imheretolearn1; 10.04.2021
comment
@imheretolearn1 .then() всегда возвращает обещание и делает это до выполнения обратного вызова — обратный вызов всегда вызывается асинхронно. В большинстве случаев .then() возвращает промис еще до того, как он узнает, какой обратный вызов должен быть вызван, поскольку промис, для которого он был вызван, еще не установлен. - person Bergi; 11.04.2021