Мы все знакомы с этим: в одном из .then(callback)
, если обратный вызов возвращает другое обещание, скажем, lastPromise
, вся цепочка обещаний (до этого момента) фактически «станет» lastPromise
.
Внутри цепочка обещаний не проверяет, является ли вещь lastPromise
настоящим обещанием вообще. Он только проверяет, реализует ли он возможный интерфейс (имеет метод .then()
). Если это так, то он далее предполагает , что метод также соответствует spec .
Обещание должно предоставить метод then для доступа к его текущему или возможному значению или причине.
Метод then обещания принимает два аргумента:
promise.then(onFulfilled, onRejected)
Теперь вы возвращаете объект из обратного вызова, который имеет метод .then
, что делает его доступным для просмотра. Таким образом, цепочка обещаний будет относиться к этому объекту как к товарищу, который считает, что это «обещание», назовет его .then(onFulfilled, onRejected)
(который фактически является парой (resolve, reject)
).
Теперь хороший знающий знает, как поступить с (onFulfilled, onRejected)
. К сожалению, они доверяют не тому парню. Ваша реализация выглядит так:
then = (onFulfilled) => 0
На самом деле вы никогда не вызываете onFulfilled(someValue)
для разрешения из состояния ожидания, поэтому, поскольку вся цепочка теперь «становится» lastPromise
, но ваша фальшивая lastPromise
не удается разрешить / отклонить, вся цепочка просто застряла в состоянии ожидания для хорошо.
Это печальная история о слепом доверии к любому обещанию.