Как работает then в Promise?

Есть стандартный пример
setTimeout(()=>{console.log(3);},0);
Promise.resolve("Success").then(()=>{console.log(5)});
console.log(1);

в консоли будет 1 5 3

Как я понимаю Promise.resolve синхронная функция, возвращающая промис со значением.
В какой момент callback в then добавляется в очередь, а потом и в стэк?
Если я правильно разобрался, сначала отработал resolve, потом console.log, а данный then отрабатывает еще до окончания работы текущего контекста выполнения, где он был вызван. Но понять, почему и как это работает, не получается
  • Вопрос задан
  • 1932 просмотра
Решения вопроса 1
@SimasikS
Я есть
Когда функция-executor вызывает reject или resolve, то PromiseState становится "resolved" или "rejected", а все функции-обработчики из соответствующего списка перемещаются в специальную системную очередь "PromiseJobs".

Эта очередь автоматически выполняется, когда интерпретатору «нечего делать». Иначе говоря, все функции-обработчики выполнятся асинхронно, одна за другой, по завершении текущего кода, примерно как setTimeout(..,0).

Исключение из этого правила – если resolve возвращает другой Promise. Тогда дальнейшее выполнение ожидает его результата (в очередь помещается специальная задача), и функции-обработчики выполняются уже с ним.

Добавляет обработчики в списки один метод: .then(onResolved, onRejected). Метод .catch(onRejected) – всего лишь сокращённая запись .then(null, onRejected).

Он делает следующее:

Если PromiseState == "pending", то есть промис ещё не выполнен, то обработчики добавляются в соответствующие списки.
Иначе обработчики сразу помещаются в очередь на выполнение.
Здесь важно, что обработчики можно добавлять в любой момент. Можно до выполнения промиса (они подождут), а можно – после (выполнятся в ближайшее время, через асинхронную очередь).

https://learn.javascript.ru/promise
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Sanasol
@Sanasol Куратор тега JavaScript
нельзя просто так взять и загуглить ошибку
setTimeout(()=>{console.log(3);},0);
Promise.resolve("Success").then(()=>{let i=0; while(i<10000000000){i++;} console.log(5);});
console.log(1);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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