function immediate() {
console.log('immediate');
}
setTimeout(timeout0, 0);
setImmediate(immediate);
Если выполнить этот код раз 10, то видно, что порядок срабатывания функций разный, иногда первым срабатывает timeout 0, а иногда immediate. Почему так?
Schedules the "immediate" execution of the callback after I/O events' callbacks and before timers created using setTimeout() and setInterval() are triggered.
запустите этот код раз 10, и вы убедитесь что все не так как вы говорите.
если подключать fs const fs = require('fs');
то все будет так работать как вы говорите, из-за того что тратится время на подключение модуля
gmiroslav: запустите мой код 10 раз подряд, и убедитесь, что работает так, как я говорю.
По ссылке в комментарии выше написано, почему не соблюдается порядок на первом тике, про цикл обработки событий в ответе ниже. Всё четко и подробно.
Результаты:
1 2 3 4 5 6
и
4 5 6 1 2 3,
то есть они срабатывают пачками, в основном таймаут раньше, но бывает наоборот. Почему так... непонятно. Вашу Теорию с первым тиком мы опровергнули, да?
gmiroslav: Очень не хочется пересказывать своими словами статью.
process.nextTick здесь только мешает, так как выполняется после текущей фазы цикла обработки событий.
setTimeout и setImmediate добавляют колбеки в очереди разных фазы.
Порядок обработки очередей timers -> I/O -> immediates.
Если к моменту проверки таймера подошло время его выполнения, то сначала выполняется он, если нет, то setImmediate. По документации минимальная задержка 1мс, - в коде
setImmediate(() => console.log('immediate'));
setTimeout(() => console.log('timeout 0'));
const t = Date.now();
while (Date.now() - t <= 1);
первым всегда будет выполняться колбек setTimeout.
gmiroslav: наоборот, всегда вторым. Выполняется колбек из очереди фазы timers, добавляются колбеки в очередь фазы timers как минимум следующего тика цикла обработки событий и в очередь фазы check текущего.