Можно ли по этому примеру сказать что я понял event loop?
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?
- нет
Promise.resolve() - это ничто, это просто конструкция которая возвращает промис - она является синхронной, эта запись равноценна записи new Promise((resolve, reject) => resolve())
коллбэк функция - так же является синхронной, она называется executor , это ни какая ни макро таска и не микро таска - это простая синхронная задача, которая попадает в стек вызовов
а у тебя в твоём примере Promise.resolve() - это и микро и макро задача, как у тебя такое может быть - непонятно
Так и что из этого по итогу попадает в макро/микро?
Только setTimeout (макро), его callback (микро) и аналогично с then?
я думаю что макро задача будет, не тестировал такое
Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000))
Каллбэк timeout-а или then-а, или queueMicrotask- микрозадача.
Сам timeout - макро задача.
А каллбэк new Promise или Promise.resolve() в стек идут, да.
в setTimeout коллбэк который ты туда ложишь - он макро задача, в then коллбэк - микро задача
Сам timeout - макро задача.
- сам вызов setTimeout - синхронный, а вот его коллбэк - он потом становится макротаской
повнимательнее читай документацию, я когда изучал - тоже не с первого раза дошло до меня что это такое, так что то что у тебя каша в голове - это нормально
Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000))Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000))
Здесь вообще есть только макро. Промис тут не делает вообще ничего, где калбек?)
так как в .then попадают цифры которые возвращает setTimout, и раз он не принимает коллбэк а цифры то и микротаски там в помине ни какой нет)
а лишь только макротаска от setTimeout
То есть так макро:
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))
Ответы:
Я думаю вы слишком усложнили понимание 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 не имеет.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Да, конечно, я могу объяснить вам, как работает event loop на примере кода. Event loop - это механизм, который позволяет асинхронно обрабатывать события в программе, не блокируя основной поток выполнения.
Давайте рассмотрим пример на языке программирования PHP: