johnymkp
@johnymkp

Как работает then в промисах?

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 возвращает промис, то как он его формирует? Вот на примерах этих ситуаций.
  • Вопрос задан
  • 174 просмотра
Решения вопроса 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Здесь можно даже и не заподозрить, что then что-то возвращает.
Все функции в js что-то возвращают. Если явного return нет или в нём не указано значение, то возвращается undefined.

Но поскольку там null, можно подумать, что исходный промис просто как-то передается дальше.
Так и есть - вы не передали никакой callback и весь этот вызов как бы игнорируется. Этот сценарий аналогичен предыдущему.

Еще интереснее - then возвращает простое значение, которое моментально попадает в следующий then.
Это ваш callback возвращает простое значение, которое then оборачивает в отрезолвленный промис.

Можете рассказать в общих чертах, если then возвращает промис, то как он его формирует?
Ну берёт и формирует... Примерно так:
then = (onFulfilledCallback, onRejectedCallback) => {
  try {
    let newValue;

    if (this.previousValue instanceof Error) {
      newValue = onRejectedCallback(this.previousValue);
    } else {
      newValue = onFulfilledCallback(this.previousValue);
    }

    if (newValue instanceof Promise) {
      return newValue;
    } else {
      return Promise.resolve(newValue);
    }
  } catch (error) {
    return Promise.reject(error);    
  }
}
Это псеводокод но общий смысл такой.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
RTFM. Там всё описано.
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы