Nó soluções de programação assíncronos

prefácio

Nó Graças à sua assíncrono não-bloqueio de E / S exibiu excelente desempenho e desenvolver. No entanto, I / O assíncrono também trouxe um correspondente série de perguntas, o inferno de retorno de chamada, de forma recursiva aninhados. . . Aqui sido criticado que alguns solução de gravação assíncrona que permite Nó paralela I / O processamento de uma melhor utilização

soluções

Os principais soluções encontram-se resumidos como segue:

  1. Publish / subscribe modelo
  2. Promise / modo diferidos
  3. biblioteca de Controle de Eventos

modelo de assinatura Publicado

Publish-Subscribe padrão é um padrão de design em JavaScript pode ser usado na forma de retorno de chamada, ele vai mudar com a mudança, em parte, foi dissociado, só se preocupam com os processos de negócios específicos, sem a necessidade de tratamento cuidados intermediários. Javascript publicar modelo de assinatura , Nó em eventsimplementos módulo a publicar subscrever modo nativo

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);
})

O mesmo evento exceder 10 ouvintes podem causar vazamentos de memória, receberá um aviso, além disso, a fim EventEmitter para eventos de erro punho irá detectar se há erro ouvintes de eventos quando ocorre um erro, se houver um erro será tratado com o ouvinte. Pode EventEmitter facilmente herdar pelo módulo util

const events = require("events");
const util = require("util");

function Events(){
  return events.EventEmitter.call(this);
}
util.inherits(Events,events.EventEmitter);

função parcial

função parcial é determinada pelo número de vezes para executar as funções de determinar se é necessário executar as funções da função

const after = function(times,callback){
  let result = {},count = 0;
  return function(key,value){
    result[key] = value;
    if(++count===times){
      return callback(result);
    }
  }
}

De acordo com esta propriedade pode ser utilizada desempenho de processamento de I / O assíncrono de funções parciais usando Nó, um olhar processo não assíncrona usando funções parciais (comum de retorno de chamada processo inferno)

fs.readdir(path.join(__dirname,".."),function(err,files){
  files.forEach(function(filename,index){
    fs.readFile(filename,"utf-8",function(err,file){
      // TODO
    })
  })
})

Nó em comum no código acima, o código comum para completar a tarefa, usando o código de cima é qualquer vantagem para o nó assíncrono de I / O, torna-se um processo em série, mas a vantagem é que o processo de processamento paralelo nó como o processamento

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){})

Adicionar o processamento da função parcial

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);
})

Promise / modo diferidos

Publicado 85 artigos originais · ganhou elogios 62 · vê 20000 +

Acho que você gosta

Origin blog.csdn.net/qq_36754767/article/details/105241844
Recomendado
Clasificación