В соответствии с техническим заданием обещание выполнить или отклонить обработчик всегда называют асинхронно ПОСЛЕ завершения цикла события. Таким образом, p12
не разрешается немедленно, даже если аргументы для него - все разрешенные обещания. Таким образом, он не будет устранен до тех пор, пока не закончится цикл этого события. Это объясняет, почему ваш первый отчет:
console.log(p12);
показывает, что обещание по-прежнему «ожидает». Это текущие .then()
обработчики (если они есть) еще не были вызваны. Однако, как только текущий поток кода завершит выполнение и управление вернется к следующему событию в очереди событий, обещание будет разрешено, и, таким образом, ваш setTimeout()
видит, что он будет разрешен к тому времени.
Это делается по соображениям совместимости вызывающего абонента, так что .then()
обработчиков не вызывается последовательно в асинхронном режиме, независимо от того, было ли обещание уже решены или пока не решено. Это позволяет коду вызова всегда кодировать последовательно, не беспокоясь о том, может ли обещание уже разрешиться. Во всех случаях вызывается обработчики .then()
после того, как текущий стек разматывается и заканчивается.
Из Promises/A+ specification:
onFulfilled или onRejected не должен вызываться до выполнения контекста стек содержит только код платформы.
Здесь «код платформы» означает двигатель, окружающую среду и обещание код реализации. На практике это требование гарантирует, что onFulfilled и onRejected выполняются асинхронно, после того, как событие завершает цикл, в котором затем вызывается, и со свежей стекой. Это может быть , реализованный либо с помощью механизма макрозадачи, такого как setTimeout, либо setImmediate, или с помощью механизма «микрозадания», такого как MutationObserver или process.nextTick. Поскольку реализация обещания считается кодом платформы, она сама может содержать очередь планирования задач очереди или «трамплин», в которой вызываются обработчики.
Итак, результат всего этого заключается в том, Хотя внутренние детали могут быть немного сложнее, чем это (возможно, связанные с микро-задачами), вы можете логически подумать о том, что обещание будет устранено, отправив сообщение в очередь событий, которое теперь ожидает разрешения/отклонения. И всякий раз, когда очередь событий заканчивает то, что в настоящее время работает, и получает поворот для выполнения обещаний .then()
обработчиков, только тогда они будут выполняться.
Попытайтесь изменить свои разрешения на: 'Promise.resolve (true);' – CodingGorilla