Можно ли по этому примеру сказать что я понял event loop?

Ссылка скопирована
1 мая 2026 1 ответ

MS - микро задачи
MC - макро задачи

function test(num) { 	console.log(`#${num}`); }  Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000) /* MC5 */); // MC1  setTimeout(() => test(1) /* MS2 */,1000); // MC2 setTimeout(() => test(2) /* MS3 */,0); // MC3 setTimeout(() => test(3) /* MS4 */,2000); // MC4  const p = new Promise(    (resolve) => {      setTimeout(() => resolve() /* MS6 */, 1000); // MC7   } // MS5    ); // MC6  p.then(() => test(5) /* MS7 */);  /* Queue  	MC5 => MS1 	MC1 => MC5   MC2 => MS2   MC3 => MS3   MC4 => MS4   MC6 => MS5 => MC7   MC7 => MS6 => MS7         result:    	#2     #4     #1     #5     #3    */

function test(num) { console.log(`#${num}`); } Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000) /* MC5 */); // MC1 setTimeout(() => test(1) /* MS2 */,1000); // MC2 setTimeout(() => test(2) /* MS3 */,0); // MC3 setTimeout(() => test(3) /* MS4 */,2000); // MC4 const p = new Promise( (resolve) => { setTimeout(() => resolve() /* MS6 */, 1000); // MC7 } // MS5 ); // MC6 p.then(() => test(5) /* MS7 */); /* Queue MC5 => MS1 MC1 => MC5 MC2 => MS2 MC3 => MS3 MC4 => MS4 MC6 => MS5 => MC7 MC7 => MS6 => MS7 result: #2 #4 #1 #5 #3 */

И ещё, конкретно в этом участке.

Promise.resolve() - это микро задача, порождающая микро задачу, порождающая макро задачу, которая порождает микро задачу или =>
Promise.resolve() - это макро задача, порождающая микро задачу, порождающая макро задачу, которая порождает микро задачу?

Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000) /* MC5 */); // MC1

Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000) /* MC5 */); // MC1

Дополнительно:

Можно ли по этому примеру сказать что я понял event loop?

- нет

  • szQocks, этого мало.
  • historydev,

    Promise.resolve() - это ничто, это просто конструкция которая возвращает промис - она является синхронной, эта запись равноценна записи new Promise((resolve, reject) => resolve())

    коллбэк функция - так же является синхронной, она называется executor , это ни какая ни макро таска и не микро таска - это простая синхронная задача, которая попадает в стек вызовов

    а у тебя в твоём примере Promise.resolve() - это и микро и макро задача, как у тебя такое может быть - непонятно

  • szQocks,
    Так и что из этого по итогу попадает в макро/микро?
    Только setTimeout (макро), его callback (микро) и аналогично с then?
  • historydev, в setTimeout коллбэк который ты туда ложишь - он макро задача, в then коллбэк - микро задача

    я думаю что макро задача будет, не тестировал такое

    Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000))

  • szQocks, Вот смотри https://learn.javascript.ru/event-loop#makrozadach...

    Каллбэк timeout-а или then-а, или queueMicrotask- микрозадача.
    Сам timeout - макро задача.

    А каллбэк new Promise или Promise.resolve() в стек идут, да.

  • historydev,

    в setTimeout коллбэк который ты туда ложишь - он макро задача, в then коллбэк - микро задача

    Сам timeout - макро задача.

    - сам вызов setTimeout - синхронный, а вот его коллбэк - он потом становится макротаской

    повнимательнее читай документацию, я когда изучал - тоже не с первого раза дошло до меня что это такое, так что то что у тебя каша в голове - это нормально

  • szQocks,
    Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000))

    Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000))

    Здесь вообще есть только макро. Промис тут не делает вообще ничего, где калбек?)

  • WbICHA, я ща проверил, да тут только макротаска

    так как в .then попадают цифры которые возвращает setTimout, и раз он не принимает коллбэк а цифры то и микротаски там в помине ни какой нет)

    а лишь только макротаска от setTimeout

  • szQocks,

    То есть так макро:

    Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000))

    Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000))

    А так микро + макро?

    Promise.resolve().then(() => setTimeout(() => test(4) /* MS1 */, 1000))

    Promise.resolve().then(() => setTimeout(() => test(4) /* MS1 */, 1000))

  • historydev, да
  • szQocks, я и не заметил что каллбэк туда не передал, спал уже)
  • Ответы:

    Я думаю вы слишком усложнили понимание event loop.
    Это лишь механизм для управления асинхронным кодом.
    Позволяющий отслеживать готовность выполнения кода.

    Вот простой пример:

    console.log('Start');  // Асинхронная функция, возвращающая промис const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));  // Использование промиса с задержкой в 2 секунды delay(2000)   .then(() => {     console.log('Promise resolved');   });  // Синхронная функция console.log('End');

    console.log('Start'); // Асинхронная функция, возвращающая промис const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); // Использование промиса с задержкой в 2 секунды delay(2000) .then(() => { console.log('Promise resolved'); }); // Синхронная функция console.log('End');

    Как только функция delay завершит выполнение, она вернет промис с результатом.

    Удобство event loop в том, что бы понимать когда код будет закончен, для ваших последующих действий.

    С тем какая именно будет логика выполнения вашего кода, ничего общего event loop не имеет.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Антон С. Ответ

    Да, конечно, я могу объяснить вам, как работает event loop на примере кода. Event loop - это механизм, который позволяет асинхронно обрабатывать события в программе, не блокируя основной поток выполнения.

    Давайте рассмотрим пример на языке программирования PHP:

    // Создаем новый Event Loop
    $loop = \React\EventLoop\Factory::create();

    // Добавляем таймер, который будет выполняться каждую секунду
    $loop->addPeriodicTimer(1, function() {
    echo "Timer executed

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно