Каким образом выполняется метод then() в промисах?

Как then метод возвращает промис, и каким образом это происходит при обработке асинхронных операций с использованием промисов?
  • 3 апреля 2024 г. 8:29
Ответы на вопрос 4
Метод then() в промисах выполняется путем добавления колбэка (callback) в цепочку обработки промиса. Когда промис завершает свое выполнение (успешно или с ошибкой), колбэк переданный в then() будет вызван.

Когда then метод вызывается, он возвращает новый промис. Этот новый промис будет разрешен либо значением, возвращенным функцией обратного вызова, переданной в then, либо значением полученным от предыдущего промиса (если функция обратного вызова не была предоставлена). Таким образом, каждый вызов then() возвращает новый промис, который может быть использован для организации цепочек асинхронных операций.

При обработке асинхронных операций с использованием промисов, then() используется для обработки результатов выполнения этих операций. Когда асинхронная операция завершается, промис разрешается (fulfilled) и вызывается соответствующий колбэк, переданный в then(). Колбэк может вернуть новое значение или промис, который будет использоваться для следующего шага в цепочке операций. Таким образом, then() позволяет удобно управлять последовательностью асинхронных операций в промисах.
Здесь можно даже и не заподозрить, что 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);    
  }
}
Это псеводокод но общий смысл такой.
RTFM . Там всё описано.
Похожие вопросы