I/O - nextTick and setimmediate

По описанию nextTick срабатывает перед события ввода/вывода а setImmediate после них,

     setImmediate(() => {   console.log('setImmediate')   })
     process.nextTick(() => {   console.log('process.nextTick')   })

Вывод будет

`process.nextTick`
`setImmediate`

По описанию nextTick срабатывает перед операциями ввода/вывода, а setImmediate после.

Объясните как понимать операнции “ввода/вывода” в среде NodeJS? Какой пример можно привести с такой операцией?

1 лайк

Ввод-вывод - это процесс получения данных из-за пределов виртуальной машины nodejs. Например по http или при считывании файла.

Пример с пояснением:

Обработка функций в js происходит в eventLoop. Назовем каждый цикл eventLoop-а tick. Циклы eventLoop-а, проходят tick-1, tick-2, tick-3 итд.

Коллбеки, зарегистрированные с помощью nextTick будут выполняться в конце текущего tick-a. И если ты будет регистрировать nextTick коллбеки рекурсивно в коллбеке nextTick, то они будут выполняться до того как eventLoop перейдет к обработке следующего tick-a.

Например ты описал и вызвал рекурсивное вычисление большого числа фибонначи с помощью nextTick. Пусть суммарно nextTick коллбеки будут выполняться 1000ms (т.е. ты считаешь большое число фибонначи). И вместе с вычислением фионаччи, ты начал чтение директории (io). Так вот директория прочитается только после того как выполнятся все nextTick коллбеки. Т.е. через 1000ms. Что совсем неожиданно.

Если же функцию вычисления числа фибонначи реализовать через setImmediate, то директория прочитается до того как досчитается число фиббоначи.

Отличное пояснение на анлийском из документации: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#process-nexttick

2 лайка