Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   process.nextTick и setImmediate (https://javascript.ru/forum/node-js-io-js/60592-process-nexttick-i-setimmediate.html)

zett 09.01.2016 02:58

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

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

$ node -v
v5.2.0

Яростный Меч 09.01.2016 12:55

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

Соответственно, до обработки запроса дело не доходит, он висит в очереди.

zett 09.01.2016 14:55

Цитата:

Сообщение от Яростный Меч (Сообщение 403072)
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 года хотя бы )) видать все поменялось :)

Яростный Меч 09.01.2016 17:22

zett,
По таким тонким вещам всегда есть смысл заглянуть в официальную доку. Для nextTick в самом низу параграфа есть примечание.

vasa_c 09.01.2016 22:16

Нет, сначала назвали "next tick", а потом пишут примечание, что он на текущий тик ставится )

zett 09.01.2016 23:29

Всех благодарю :)


Часовой пояс GMT +3, время: 08:02.