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:
- Publish / subscribe modelo
- Promise / modo diferidos
- 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 events
implementos 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);
})