2013-04-25 5 views
7

У меня возникли проблемы с пониманием того, как process.nextTick делает свою работу. Я думал, что я понял, но я не могу повторить, как я чувствую, что это должно работать:понимание очереди событий node.js и process.nextTick

var handler = function(req, res) { 
    res.writeHead(200, {'Content-type' : 'text/html'}); 
    foo(function() { 
     console.log("bar"); 
    }); 
    console.log("received"); 
    res.end("Hello, world!"); 
} 

function foo(callback) { 
    var i = 0; 
    while(i<1000000000) i++; 
    process.nextTick(callback); 
} 

require('http').createServer(handler).listen(3000); 

Хотя foo зацикливается, я пришлю в течение нескольких запросов, при условии, что handler будет поставлен в очередь несколько раз за foo с callback выдается только в том случае, если foo закончен.

Если я правильно о том, как это работает, я полагаю, что результат будет выглядеть следующим образом:

received 
received 
received 
received 
bar 
bar 
bar 
bar 

Но это не так, это просто последовательный:

received 
bar 
received 
bar 
received 
bar 
received 
bar 

Я вижу, что foo возвращается до выполнения callback, который ожидается, но, похоже, что callback СЛЕДУЕТ в строке, а не в конце очереди, за всеми входящими запросами. Это так, как это работает? Возможно, я просто не понимаю, как именно работает очередь событий в узле. И, пожалуйста, не указывайте мне here. Благодарю.

ответ

2

process.nextTick помещает обратный вызов на следующий тик, который будет выполнен, а не в конце очереди тика.

Node.js doc (http://nodejs.org/api/process.html#process_process_nexttick_callback) say: «Обычно это происходит перед любыми другими событиями ввода-вывода, но есть некоторые исключения».

setTimeout (callback, 0), вероятно, будет работать больше, чем вы описываете.

+2

Нет, 'setTimeout' вел себя одинаково. Наверное, я действительно спрашиваю, как я должен начать обрабатывать HTTP-запросы до того, как будет выполнен предыдущий запрос. – alf

+0

На самом деле, я понял, что 'setTimeout' делает именно то, что я искал, поэтому прошу прощения. Но что именно означает 'process.nextTick', если он не позволяет чередовать интенсивные задачи процессора и обработку HTTP? – alf

+0

«Не в конце тика» - так, есть ли способ нажать произвольную функцию в конце очереди событий? Является ли 'setTimeout (fn, 0)' рекомендуемым способом или просто обходным путем? – incarnate

1

Вы должны, конечно, читать ссылки fgascon при условии, и, возможно,

https://github.com/joyent/node/issues/3335 для более фона.

Используйте process.nextTick, если вы хотите вызвать какой-либо код перед любым IO, но после того, как вызванный контекст вернулся (обычно потому, что вы хотите зарегистрировать слушателей на эмиттере событий и вам нужно вернуть созданный эмиттер, прежде чем вы сможете зарегистрироваться что-нибудь).

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