머리말
비동기 I 비 차단 / O는 뛰어난 성능을 전시하고 발전의에 노드 감사합니다. 그러나, 비동기 I / O가 또한 질문의 대응 시리즈를 가져왔다, 콜백 도대체, 재귀 적으로 중첩. . . 노드 있도록 일부 비동기식 기록 액 I 평행 본원 비판 / O는 활용도 처리
솔루션
다음과 같은 주요 솔루션 요약 :
- 게시 / 가입 모델
- 약속 / 이연 모드
- 이벤트 제어 라이브러리
게시 가입 모델
게시 - 구독 패턴은 자바 스크립트 디자인 패턴은 중간 관리 치료를 필요로하지 않고, 단지 특정 비즈니스 프로세스에 대해 신경, 그것은, 분리 된 부분의 변화로 변경됩니다 콜백의 형태로 사용될 수있다. 자바 스크립트는 가입 모델을 게시 에 노드를 events
기본 모드를 구독 게시 모듈 구현
const events = require("events");
const fs = require("fs");
const emitter = new events.EventEmitter();
emitter.on("read_foo",function(err,data){
console.log(data);
})
fs.readFile("./profile.jpg",function(err,data){
return emitter.emit("read_foo",err,data);
})
같은 이벤트가 추가로 경고를 얻을 것이다, 10 청취자가 메모리 누수가 발생할 수 초과, 오류가 청취자에게 처리됩니다있을 경우 오류가 발생할 때 오류 이벤트 리스너가 있는지 여부를 감지합니다 핸들 오류 이벤트에 EventEmitter 순서. 수 폴더의 유틸리티 모듈로 쉽게 상속 EventEmitter
const events = require("events");
const util = require("util");
function Events(){
return events.EventEmitter.call(this);
}
util.inherits(Events,events.EventEmitter);
일부 기능
일부 기능은 기능의 기능을 수행할지 여부를 결정하는 기능을 수행하는 횟수에 의해 결정된다
const after = function(times,callback){
let result = {},count = 0;
return function(key,value){
result[key] = value;
if(++count===times){
return callback(result);
}
}
}
이 특성에 따르면, 노드, 표정없이 비동기 프로세스 일부 함수를 사용하여 (일반적인 콜백 지옥 프로세스)를 사용하여 일부 기능 비동기 I / O 처리 성능에 이용 될 수있다
fs.readdir(path.join(__dirname,".."),function(err,files){
files.forEach(function(filename,index){
fs.readFile(filename,"utf-8",function(err,file){
// TODO
})
})
})
위의 코드에서 공통 노드는 공통 코드는 직렬 처리된다 I / O 비동기 노드에 어떠한 이점을 상기 코드되어 사용하지 작업을 완료하지만, 장점 처리와 해당 노드의 병렬 처리 절차
fs.readdir(path.join(__dirname,".."),function(err,files){})
fs.readFile("./profile.jpg","utf-8",function(err,data){})
fs.readFile("./sun.jpg","utf-8",function(err,data){})
일부 기능 처리를 추가
const fs = require("fs");
const path = require("path");
const events = require("events");
const emitter = new events.EventEmitter();
const after = function(times,callback){
let result = {},count = 0;
return function(key,value){
result[key] = value;
if(++count===times){
return callback(result);
}
}
}
const done = after(3,function(res){
console.log(res)
})
emitter.on("done",done);
fs.readdir(path.join(__dirname,".."),function(err,files){
emitter.emit("done","data1",files);
})
fs.readFile("./profile.jpg","utf-8",function(err,data){
emitter.emit("done","data2",data);
})
fs.readFile("./sun.jpg","utf-8",function(err,data){
emitter.emit("done","data3",data);
})