Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.01.2016, 02:58
Новичок на форуме
Отправить личное сообщение для zett Посмотреть профиль Найти все сообщения от zett
 
Регистрация: 09.01.2016
Сообщений: 9

process.nextTick и setImmediate
Всем здравствуйте. Подскажите пожалуйста, уже голова пухнет..

Почему в этом коде, HTTP запрос отваливается по таймауту:
https://gist.github.com/v-gachkovsky...0428f20037f403
... а если заменить "process.nextTick(tick);" на "setImmediate(tick);" то все ок?

$ node -v
v5.2.0
Ответить с цитированием
  #2 (permalink)  
Старый 09.01.2016, 12:55
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

nextTick никого не пропускает вперед себя в событийном цикле (вроде последний даже не прокручивается, пока есть задачи nextTick). В твоем коде он будет аналогичен простому бесконечному циклу while.
nextTick можно использовать только одноразово - чтобы выполнить действия сразу по завершении текущего потока действий.

Соответственно, до обработки запроса дело не доходит, он висит в очереди.
Ответить с цитированием
  #3 (permalink)  
Старый 09.01.2016, 14:55
Новичок на форуме
Отправить личное сообщение для zett Посмотреть профиль Найти все сообщения от zett
 
Регистрация: 09.01.2016
Сообщений: 9

Сообщение от Яростный Меч Посмотреть сообщение
nextTick никого не пропускает вперед себя в событийном цикле (вроде последний даже не прокручивается, пока есть задачи nextTick). В твоем коде он будет аналогичен простому бесконечному циклу while.
nextTick можно использовать только одноразово - чтобы выполнить действия сразу по завершении текущего потока действий.

Соответственно, до обработки запроса дело не доходит, он висит в очереди.
Ок, большое спасибо за ответ Примерно такие догадки были и у меня.. Но меня смутила одна статья

http://howtonode.org/understanding-process-next-tick

Там есть такой же код и автор пишет:
In this model, instead of calling compute() recursively, we use process.nextTick() to delay the execution of compute() till the next tick of the event loop. By doing so, we ensure that if any other HTTP requests are queued in the event loop, they will be processed before the next time compute() gets invoked. If we had not used process.nextTick() and had simply called compute() recursively, the program would not have been able to process any incoming HTTP requests. Try it for yourself!

Наверное глупая идея читать доки младше 2014 года хотя бы )) видать все поменялось
Ответить с цитированием
  #4 (permalink)  
Старый 09.01.2016, 17:22
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

zett,
По таким тонким вещам всегда есть смысл заглянуть в официальную доку. Для nextTick в самом низу параграфа есть примечание.
Ответить с цитированием
  #5 (permalink)  
Старый 09.01.2016, 22:16
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

Нет, сначала назвали "next tick", а потом пишут примечание, что он на текущий тик ставится )
Ответить с цитированием
  #6 (permalink)  
Старый 09.01.2016, 23:29
Новичок на форуме
Отправить личное сообщение для zett Посмотреть профиль Найти все сообщения от zett
 
Регистрация: 09.01.2016
Сообщений: 9

Всех благодарю
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Асинхронный вызов функций Octane Общие вопросы Javascript 6 30.03.2014 04:11
process.nextTick dmitriymar AJAX и COMET 6 01.12.2012 22:41