2017-01-17 2 views
1

Я новичок в node.js и немного запутался в понимании цикла событий. Насколько я знаю из https://github.com/nodejs/node/blob/master/doc/topics/event-loop-timers-and-nexttick.md, фазы цикла событий обрабатывают только setTimeout, setInterval, setImmediate, process.nextTick, обещания и некоторые обратные вызовы ввода-вывода.Какая фаза цикла события выполняет Ordinady Код JavaScript

Мой вопрос, если у меня есть следующий код:

для (вар я = 0; я < 100000000; я ++) ;

В какой фазе вышеуказанный код будет выполнен?

+0

Если я чего-то не упускаю, я бы не ожидал, что for-loop будет рассматриваться как событие, которое должно обрабатываться циклом события. – Carcigenicate

+0

'Обратные вызовы ввода/вывода: выполняет почти все обратные вызовы ...'. В узле HTTP-сервером, обрабатывающим запрос, является ввод-вывод. –

+0

так, где будет выполняться код. Выполняется ли это через callstack? –

ответ

1

Обычный код JavaScript, например цикл for в вашем примере, выполняется до того, как очереди очищены. Первое, что нужно сделать, это запустить ваш код и будет вызывать только обратные вызовы, результаты тайм-аута, результаты ввода-вывода и т. Д. после ваш код заканчивается.

В качестве примера, вы можете попробовать этот код:

fs.open('filename', 'r',() => { 
    console.log('File opened.'); 
}); 

for (var i = 0; i < 100000000; i++); 

console.log('Loop complete.'); 

Независимо от того, насколько велика или мала ваша переменная цикла «Loop полного» всегда будет появляться перед «открыл файл». Это связано с тем, что только с одним потоком узел не может выполнить обратный вызов, который вы передали функции fs.open, пока код цикла не завершится.

Помните, что не существует «основной» нити, к которой узел возвращается. Большинство долговременных узловых программ довольно быстро запускаются через код в main.js, а последующий код будет поступать от обратных вызовов. Цель первоначального выполнения - определить, как и когда эти обратные вызовы происходят.

+0

, имеет смысл. Спасибо за твой ответ. –

0

В доке петли события узла (https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick), следующий код приведен в качестве примера:

const fs = require('fs'); 

function someAsyncOperation(callback) { 
    // Assume this takes 95ms to complete 
    fs.readFile('/path/to/file', callback); 
} 

const timeoutScheduled = Date.now(); 

setTimeout(() => { 
    const delay = Date.now() - timeoutScheduled; 

    console.log(`${delay}ms have passed since I was scheduled`); 
}, 100); 


// do someAsyncOperation which takes 95 ms to complete 
someAsyncOperation(() => { 
    const startCallback = Date.now(); 

    // 10ms loop 
    while (Date.now() - startCallback < 10) { 
    // do nothing 
    } 
}); 

Цикла продолжает сканирование в соответствии с фазами и после fs.readFile() отделки, очередь опроса пусто, так его обратный вызов будет добавлен и немедленно выполнен. Обратный вызов удерживает блокирующий 10 мс цикл до запуска таймера. Вот почему задержка покажет: 105ms have passed since I was scheduled вместо 100 мс, которые вы могли бы ожидать.

Большая часть вашего кода будет работать в обратных вызовах, поэтому он будет выполнен в фазе . Если нет, как и в вашем примере, он будет выполнен до ввода любых фаз, поскольку он заблокирует цикл события.

Предостережение - это обратные вызовы, запланированные setImmediate, которые войдут в фазу , прежде чем возобновить фазу опроса в следующем цикле.

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