У меня возникли проблемы с пониманием того, как 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. Благодарю.
Нет, 'setTimeout' вел себя одинаково. Наверное, я действительно спрашиваю, как я должен начать обрабатывать HTTP-запросы до того, как будет выполнен предыдущий запрос. – alf
На самом деле, я понял, что 'setTimeout' делает именно то, что я искал, поэтому прошу прощения. Но что именно означает 'process.nextTick', если он не позволяет чередовать интенсивные задачи процессора и обработку HTTP? – alf
«Не в конце тика» - так, есть ли способ нажать произвольную функцию в конце очереди событий? Является ли 'setTimeout (fn, 0)' рекомендуемым способом или просто обходным путем? – incarnate