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
连接成功。
数据接收成功。
程序执行完毕。

어떻게 노드 응용 프로그램을 사용할 수 있습니까?

마지막 파라미터 콜백 함수가 상기 제 파라미터와 오류 객체를 수신하는 노드 어플리케이션 기능은 비동기 작업 콜백 기능을 수행한다.

우리는 앞의 예에서 다시 봐 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을 출력 Err 개체를 이동하지 않는 경우, 파일의 컨텐츠는 콜백 함수를 통해 출력된다.

다음과 같이 위의 코드를 실행, 실행 결과는 다음과 같습니다

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

다음과 같이 다음에 우리는 실행 결과는 input.txt를 파일을 삭제합니다 :

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

input.txt를 파일이 존재 때문에 에러 메시지를 출력하지 않기 때문에.