Skip to content

Корректирует описание поведения промиса в модели Event loop в статье Асинхронность#5957

Open
altynaymm wants to merge 1 commit intodoka-guide:mainfrom
altynaymm:patch-1
Open

Conversation

@altynaymm
Copy link

@altynaymm altynaymm commented Jan 31, 2026

текущая формулировка может ввести в заблуждение относительно работы Promise в цикле событий: создаётся впечатление, что resolve / reject являются частью web api и попадают в очередь задач так же, как setTimeout. На практике асинхронность обеспечивается внешними API (таймеры, I/O и т.п.), а Promise лишь реагирует на их завершение. Вызовы resolve / reject не являются макрозадачами и не попадают в очередь задач напрямую: они изменяют состояние Promise и планируют выполнение обработчиков .then / .catch в очереди микрозадач.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Execution_model

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

Превью: https://content-5957.dev.doka.guide/js/async-in-js/

текущая формулировка может ввести в заблуждение относительно работы Promise в цикле событий: создаётся впечатление, что resolve / reject являются частью web api и попадают в очередь задач так же, как setTimeout. На практике асинхронность обеспечивается внешними API (таймеры, I/O и т.п.), а Promise лишь реагирует на их завершение. Вызовы resolve / reject не являются макрозадачами и не попадают в очередь задач напрямую — они изменяют состояние Promise и планируют выполнение обработчиков .then / .catch в очереди микрозадач.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Execution_model

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/
@github-actions github-actions bot added js Контент по JavaScript статья Расширенный материал labels Jan 31, 2026
@github-actions
Copy link

Превью контента из опубликовано.

@vitya-ne vitya-ne added the ошибка Что-то критичное и мешает label Feb 1, 2026
@vitya-ne vitya-ne changed the title Fix misleading description of Promise and event loop Корректирует описание поведения промиса в модели Event loop в статье Асинхронность Feb 1, 2026

В понятиях цикла событий промис работает так же, как колбэк: функция, которая должна выполниться (`resolve` или `reject`), находится в окружении Web API, а при наступлении события — попадает в очередь задач, откуда потом — в стек вызова.
В модели цикла событий Promise сам по себе не выполняет асинхронный код.
Асинхронные операции (например, таймеры или сетевые запросы) выполняются во внешней среде (Web API или libuv).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Web API или libuv

Я бы добавил некоторое пояснение что такое libuv или не упоминал её тут.
Выше в статье есть описание Web API, но про "внебраузерное" выполнение не говорится.

Suggested change
Асинхронные операции (например, таймеры или сетевые запросы) выполняются во внешней среде (Web API или libuv).
В браузере асинхронные операции (например, таймеры или сетевые запросы) выполняются в окружении Web API.

В понятиях цикла событий промис работает так же, как колбэк: функция, которая должна выполниться (`resolve` или `reject`), находится в окружении Web API, а при наступлении события — попадает в очередь задач, откуда потом — в стек вызова.
В модели цикла событий Promise сам по себе не выполняет асинхронный код.
Асинхронные операции (например, таймеры или сетевые запросы) выполняются во внешней среде (Web API или libuv).
Когда такая операция завершается, вызывается `resolve` или `reject`, которые изменяют состояние Promise и планируют выполнение обработчиков `.then`, `.catch` и `.finally` в очереди микрозадач (microtask queue).
Copy link
Contributor

@vitya-ne vitya-ne Feb 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

вызывается resolve или reject, которые изменяют состояние Promise и планируют выполнение обработчиков

Конечно это тонкости, но может сложится впечатление, что:

  • Promise.resolve() что-то "планирует";
  • при переходе примиса в fulfilled состояние в очередь микрозадач попадут колбэки из '.catch()'.

Copy link
Contributor

@vitya-ne vitya-ne left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет,
спасибо за внимательность и правку.

Я оставил пару субъективных коментов. Буду рад поспорить и оказаться неправым )

**[Промис](/js/promise/)** — это объект-обёртка для асинхронного кода. Он содержит в себе состояние: вначале `pending` («ожидание»), затем — одно из: `fulfilled` («выполнено успешно») или `rejected` («выполнено с ошибкой»).

В понятиях цикла событий промис работает так же, как колбэк: функция, которая должна выполниться (`resolve` или `reject`), находится в окружении Web API, а при наступлении события — попадает в очередь задач, откуда потом — в стек вызова.
В модели цикла событий Promise сам по себе не выполняет асинхронный код.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давай может либо везде Promise писать, либо Промис? Чтобы согласованно смотрелось

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

js Контент по JavaScript ошибка Что-то критичное и мешает статья Расширенный материал

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants