Node.js: http.request() срабатывает после setImmediate()
Я новичок в Node, поэтому следующее поведение кода мне не понятно:
function step(iteration) {
if (iteration === 10) return;
process.nextTick(() => {
step(iteration + 1); // Recursive call from nextTick handler.
console.log(`nextTick iteration: ${iteration}`);
});
http.request({hostname: '127.0.0.1', port: 5000}, (response) => {
console.log("here !");
}).end();
setImmediate(() => {
console.log(`setImmediate iteration: ${iteration}`);
});
}
step(0);
ВЫХОД:
nextTick iteration: 0
...
nextTick iteration: 9
setImmediate iteration: 0
...
setImmediate iteration: 9
here !
here !
here !
here !
here !
here !
here !
here !
here !
here !
Вопросы:
1) почему http.request()
обратный вызов срабатывает после setImmediate()
? Я понимаю, почему setImmediate()
обычно называется: его обратные вызовы были зарегистрированы во время цикла. Но, как сказано в документации, setImmediate()
это фаза проверки, которая должна обрабатываться в цикле событий после первого опроса. Если я правильно поняла, http.request()
после nextTick()
должна быть эта фаза опроса;
2) но если http.request()
не обрабатывается в опросе, на каком этапе это происходит? Особенно учитывая, что это работает после setImmediate()
,
Моя версия Node.js - 6.11.2. Заранее спасибо за объяснение.
1 ответ
Чтобы ответить на ваши вопросы:
http.request()
называется раньшеsetImmediate()
, Тем не мение,http.request
асинхронный В вашем случае обратный вызов не выполняется до тех пор, пока запрос не будет решен. Это означает, что хотя он вызывается первым, обратный вызов ничего не регистрирует до более позднего момента времени, и этот момент находится послеsetImmediate()
решил.- Даже если
setImmediate
ставит в очередь его обратные вызовы для выполнения в том порядке, в котором они находятся в очереди, они все еще могут разрешить до возврата запроса.
Чтобы выполнить ваши шаги по порядку, рассмотрите возможность перемещения содержимого nextTick
с точностью до обратного вызова для запроса:
function step(iteration) {
if (iteration === 10) return;
http.request({hostname: '127.0.0.1', port: 8000}, (response) => {
console.log("here !");
step(iteration + 1); // Recursive call from nextTick handler.
console.log(`nextTick iteration: ${iteration}`);
}).end();
setImmediate(() => {
console.log(`setImmediate iteration: ${iteration}`);
});
}
step(0);
В этом фрагменте я удалил nextTick
, хотя вы можете безопасно добавить его в обратный вызов, если это необходимо.