비동기 프로그래밍 솔루션 노드

머리말

비동기 I 비 차단 / O는 뛰어난 성능을 전시하고 발전의에 노드 감사합니다. 그러나, 비동기 I / O가 또한 질문의 대응 시리즈를 가져왔다, 콜백 도대체, 재귀 적으로 중첩. . . 노드 있도록 일부 비동기식 기록 액 I 평행 본원 비판 / O는 활용도 처리

솔루션

다음과 같은 주요 솔루션 요약 :

  1. 게시 / 가입 모델
  2. 약속 / 이연 모드
  3. 이벤트 제어 라이브러리

게시 가입 모델

게시 - 구독 패턴은 자바 스크립트 디자인 패턴은 중간 관리 치료를 필요로하지 않고, 단지 특정 비즈니스 프로세스에 대해 신경, 그것은, 분리 된 부분의 변화로 변경됩니다 콜백의 형태로 사용될 수있다. 자바 스크립트는 가입 모델을 게시 에 노드를 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);
})

약속 / 이연 모드

게시 85 개 원래 기사 · 원 찬양 62 ·은 20000 +를 볼

추천

출처blog.csdn.net/qq_36754767/article/details/105241844