Состояния промиса и переход между ними
У промисов есть внутреннее скрытое состояние:
- pending
- fulfilled
- rejected
Как промис переходит между ними
Когда создается промис, он находится в состоянии pending
const promise = new Promise((resolve, reject) => {/* ... */})
Далее внутри executor-функции происходит либо:
- Вызов
resolve(value)
- переводит промис из pending в fulfilled
- промис фиксируется с результатом
value - дальнейшие вызовы resolve и reject игнорируются
- Вызов
reject(reason)
- переводит промис из pending в rejected
- промис фиксируется с причиной ошибки
reson - дальнейшие вызовы resolve и reject игнорируются
После того, как промис перешел в одно из этих состояний, состояние больше не меняется. Это называется settled.
Пример
const promise = new Promise((resolve) => {
resolve(42);
console.log("still pending inside executor");
});
promise.then(console.log);
- Создается промис с состоянием pending
- Выполняется executor - функция и при вызове resolve(42) происходит переход в fulfilled, а значение результата устанавливается в 42.
- Выводится
still pending inside executorпотому, что это синхронный код. - Далее выполняется
.then. Т.к. промис уже в состоянии fulfilled, то функция, переданная в then ставится в очередь микро-задач и выполнится, когда стек вызовов очистится. В нашем случае, после выполнения п.3