Я читаю о циклах событий в node.js. В соответствии с моим просмотром различных статей и сообщений в stackexchange я получил , все обратные вызовы добавляются в конце очереди задач, а после выполнения основного файла все задачи в очереди выполняются последовательно. Я попытался подтвердить это небольшой программой. Там я обнаружил странное поведение. Ниже приведено содержимое файла main.js, который я создал.Разница в поведении node.js Цикл событий для встроенных и настраиваемых событий
//Declare file open event handler
var fs = require("fs");
var ws = fs.createWriteStream("C:\\test.txt");
ws.on("open", function(fd) {
console.log("#Event file 'open'");
});
//Wait for 5 seconds
var startTime = new Date().getTime();
console.log("Give time of 5 seconds to get file opened (being conservative)...\n");
while(new Date().getTime() - startTime < 5000) {}
//Create custom event
var util = require("util");
var EventEmitter = require("events").EventEmitter;
var CustomEventEmitter = function() {};
util.inherits(CustomEventEmitter, EventEmitter);
//Declare custom event handler
var customInstance = new CustomEventEmitter();
customInstance.on("tick", function() {
console.log("#Event custom 'tick'");
});
//Emit custom event
customInstance.emit("tick");
console.log("#End 'main.js'");
Он дал мне следующий вывод:
Give time of 5 seconds to get file opened (being conservative)...
#Event custom 'tick'
#End 'main.js'
#Event file 'open'
Журнал "#Event файл" открытым" выводится после того, как "#End 'main.js'", но как же журнал" #Event custom 'tick' "пришел первым, если он должен был находиться в очереди задач.
Я имею в виду, как встроенное событие показывает правильное поведение, а пользовательское событие - нет?
Пожалуйста, исправьте мое понимание об этом :)
hmm ... У меня было именно это на мой взгляд, и в соответствии с этим пониманием порядок вывода должен был быть таким: #End 'main.js' #Event file 'open' #Event custom 'tick' ...... main.js должен был быть первой строкой, и пользовательский тик должен был быть последним ... исправьте меня, если я ошибаюсь ... –
О, я пропустил это 'emit()' не является асинхронным. Обновлено. Полагаю, теперь это правильно объясняет ваш результат. – Trott
Спасибо, наконец, получил это ... Вы правы, это потому, что функция испускания является синхронной ([link] (https://github.com/iojs/io.js/blob/10e31ba56c676bdcad39ccad22ea9117733b8eb5/lib/events.js # L67)), и поэтому обработчик события называется синхронно. Он не помещает функцию обработчика в очередь событий ... –