Latest web development tutorials

Node.js цикл событий

Node.js является единственным процессом однопоточных приложений, но поддерживает одновременно через события и обратные вызовы, поэтому производительность очень высока.

Каждый Node.js API является асинхронным и работает как отдельный поток, с помощью асинхронных вызовов функции, и параллелизм.

Node.js по существу, весь механизм событий реализован с использованием режима наблюдателя в режиме проектирования.

Node.js похоже на ввод в один поток в то время (правда) цикл обработки событий до тех пор, пока ни один наблюдатель выхода событий, каждое асинхронное событие генерирует наблюдатель событий, если событие происходит, называется функцией обратного вызова.


Событийный программирование

Node.js используя управляемую событиями модель, когда веб-сервер получает запрос, а затем положить его на переработку и затем на запрос следующего веб-службы.

Когда запрос завершен, он возвращается в очередь на обработку, очереди, когда она достигает начала, результат возвращается к пользователю.

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

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

Весь процесс настолько событийного достичь, очень просто. Несколько похож на шаблон наблюдателя, событие эквивалентно теме (субъект), в то время как все зарегистрированного обработчика этому событию соответствует наблюдателю (наблюдатель).

Node.js имеет несколько встроенных в события, мы можем за счет внедрения модуля событий, и связывать и прослушивать события с помощью инстанцировании класс EventEmitter следующие примеры:

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

Следующая процедура обработчика события связывания:

// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);

Мы можем запрограммировать инициирующее событие:

// 触发事件
eventEmitter.emit('eventName');

примеров

Создание main.js файла, код выглядит следующим образом:

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 创建事件处理程序
var connectHandler = function connected() {
   console.log('连接成功。');
  
   // 触发 data_received 事件 
   eventEmitter.emit('data_received');
}

// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
 
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
   console.log('数据接收成功。');
});

// 触发 connection 事件 
eventEmitter.emit('connection');

console.log("程序执行完毕。");

Давайте выполним код, указанный выше:

$ node main.js
连接成功。
数据接收成功。
程序执行完毕。

Как Node приложение работает?

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

Давайте снова посмотрим на предыдущем примере, создать input.txt, документ гласит:

本教程官网地址:www.w3big.com

Создание main.js файл, следующим образом:

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err){
      console.log(err.stack);
      return;
   }
   console.log(data.toString());
});
console.log("程序执行完毕");

Программа выше fs.readFile () является асинхронной функция используется для чтения файла. Если ошибка возникает в процессе чтения файла, ошибка излишнюю объекты будет выводить сообщение об ошибке.

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

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

程序执行完毕
本教程官网地址:www.w3big.com

Далее мы удалить файл input.txt результаты выполнения следующим образом:

程序执行完毕
Error: ENOENT, open 'input.txt'

Input.txt, потому что файл не существует, поэтому вывод сообщения об ошибке.