2015-10-22 8 views
0

Я хочу лучше понять Event Loop. Я читаю документы, статьи, документы API Node.js. Почти все из них отдельные Таймеры:Что там такого исключительного в таймерах в Node.js?

setImmediate():

setImmediate (обратный вызов [, аргумент] [, ...])

Чтобы запланировать "немедленного" выполнения обратного вызова после ввода/вывода события обратные вызовы и до setTimeout и setInterval.

process.nextTick():

process.nextTick (обратный вызов [, аргумент] [, ...]) #

Это не просто псевдоним SetTimeout (Fn, 0), это намного больше эффективный. Он запускается перед любыми дополнительными событиями ввода-вывода (, включая таймеры) огонь в последующих тиках цикла событий.

Почему? Что является исключительным в функции таймера в Node.js в контексте цикла событий?

+0

Я думаю, что это просто установить приоритет в цикле обработки событий. – MinusFour

+0

«* Что настолько исключительно в отношении функций таймера *» - ну, они * timed *, им дается некоторое время в миллисекундах в качестве аргумента. – Bergi

+1

'process.nextTick()' более эффективен, чем 'setTimeout (fn, 0)', потому что он отменяет функцию до вызова следующего стека. –

ответ

1

Все это связано с наличием действительно тонкого контроля над асинхронным выполнением обратного вызова.

nextTick() Функция выполняется в кратчайшие сроки до момента ее вызова. Он получил свое название от цикла событий «tick». Тик представляет полный оборот event loop, где разный вид событий, таких как таймеры, io, сеть, исчерпывается один раз. Несмотря на то, что имя сегодня запутывает, поскольку оно изменило семантику над версиями узлов. Обратный вызов nextTick() выполняется в том же тике, что и вызывающий код. Добавление дополнительных nextTick() s в функцию обратного вызова nextTick() объединяет их, и они вызываются в одном тике.

setImmediate() дает второе ближайшее исполнение. Он почти идентичен setTimeout (0), но он вызывается перед всеми традиционными таймерами setTimeout() и setInterval(). Он обрабатывается как первое в начале следующего тика. Вы получаете вид быстрой полосы асинхронного выполнения, которая имеет привилегию по сравнению с традиционными setInterval() и setTimeout(). Добавление дополнительных обратных вызовов setImmediate() в setImmediate() само по себе откладывает их до следующего тика, и они не выполняются в одном и том же тике, в отличие от того, как nextTick() s. Эта функция setImmediate() была первоначально семантикой nextTick(), поэтому имя nextTick().

SetTimeout() и setInterval() работы, то, как и ожидалось, имеющий третью ближайшую точку exeuction (или более поздней версии, если интервалы времени длинные).

+0

Как я могу узнать, в каком повороте цикла событий я нахожусь в какой-то момент во время выполнения? Как я могу определить, будет ли цикл Event Loop, когда я посмотрю на свой исходный код? – Green

+0

Вы не можете ничего, но ничего не изменится. Все это по-прежнему выполняется: если вы хотите получить мелкозернистый контроль над точкой, когда ваш обратный вызов будет выполнен, выберите из них наилучшую подходящую функцию: - действительно супер закрывайте потенциально опасным, если использовать плохо nextTick(), правильный путь с помощью setImmediate() , или старый способ сделать это с помощью setTimeout (0). – pspi

1

Проще говоря, порядок их называют это: nextTick() -> setImmediate() -> SetTimeout (п, 0)

 Смежные вопросы

  • Нет связанных вопросов^_^