Introdução e informação
http://nodejs.org/api/events.html
http://www.infoq.com/cn/articles/tyq-nodejs-event
Eventos é o módulo mais importante do Node.JS. O módulo de eventos fornece apenas um evento de objeto. O núcleo do EventEmitter é o lançamento de eventos e o ouvinte de eventos.
A maioria dos módulos no Node.js é herdada do módulo de evento.
Ao contrário dos eventos na árvore Dom, não há atividade como captura de camada por camada.
O EventEmitter suporta vários ouvintes de eventos. Quando um evento é iniciado, o ouvinte do evento registrado neste evento é chamado em sequência e os parâmetros do evento são passados como parâmetros de função de retorno de chamada.
Como acessar:
A cópia do código é a seguinte:
requer ('eventos');
emissor.on (evento, ouvinte)
A cópia do código é a seguinte:
/*
Ligue para o módulo de eventos para obter eventos.Eventemitter Objeto
*/
var eventEMitter = requer ('eventos'). EventEmitter;
var ee = new EventEmitter ();
/*
EventEmitter.on (Evento, ouvinte) Registre um ouvinte para o evento
Parâmetro 1: string de eventos, nome do evento
Parâmetro 2: Função de retorno de chamada
*/
ee.on ('alguns_events', função (foo, bar) {
console.log ("1º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
});
console.log ('primeira rodada');
ee.emit ('Some_Events', 'Wilson', 'Zhong');
console.log ('Segunda rodada');
ee.emit ('alguns_events', 'wilson', 'z');
EventEmitter.on (evento, ouvinte) Código -fonte
emissor.emit (evento, [arg1], [arg2], [...])
A cópia do código é a seguinte:
var eventEMitter = requer ('eventos'). EventEmitter;
var ee = new EventEmitter ();
ee.on ('alguns_events', função (foo, bar) {
console.log ("1º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
});
/*
EventEmitter.emit (evento, [arg1], [arg2], [...]) desencadeia o evento especificado
Parâmetro 1: string de eventos, nome do evento
Parâmetro 2: parâmetros opcionais, passe os parâmetros da função de retorno de chamada para
Valor de retorno: se este evento é ouvido
*/
var issuccess = ee.emit ('alguns_events', 'wilson', 'zhong');
ee.on ('alguns_events', função (foo, bar) {
console.log ("2º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
});
ee.emit ('alguns_events', 'zhong', 'wei');
var issuccess2 = ee.emit ('outros_events', 'wilson', 'zhong');
console.log (ISSUCESS);
console.log (ISSUCESS2);
emitter.emit (evento, [arg1], [arg2], [...]) Código -fonte da amostra
O exemplo realizou três operações de eventos de acionamento, nas quais alguns registra a escuta, e a função Emit retornará um verdadeiro quando chamado, enquanto outros_events não registrarão a escuta, e a função Emit retornará um falso, indicando que o evento não é ouvido; Claro, você pode ignorar o valor de retorno!
emissor.once (evento, ouvinte)
A cópia do código é a seguinte:
var eventEMitter = requer ('eventos'). EventEmitter;
var ee = new EventEmitter ();
/*
EventEmitter.once (Evento, ouvinte) Registre-se de ouvir eventos, remova a escuta após o acionamento uma vez
Parâmetro 1: string de eventos, nome do evento
Parâmetro 2: Função de retorno de chamada
*/
ee.once ('alguns_events', função (foo, bar) {
console.log ("1º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
});
console.log ('primeira rodada');
ee.emit ('Some_Events', 'Wilson', 'Zhong');
console.log ('Segunda rodada');
var issuccess = ee.emit ('alguns_events', 'wilson', 'zhong');
console.log (ISSUCESS);
Emissor.once (evento, ouvinte) Código -fonte
A partir dos resultados de execução do código de exemplo acima, podemos ver que, depois de registrar um ouvinte para alguns_events com o emissor.ence, ele será acionado em duas rodadas de emissor de chamada.emit, e a segunda rodada retornará falsa; Isso significa que o registro do ouvinte em Emissor.Om é um pouco diferente de registrar o ouvinte em Emissor.Om mencionados anteriormente.
Emissor.once O escuta de registro é uma escuta única. Quando acionado uma vez, a escuta será removida! Claro, é mais óbvio do nome ^_ ^!
Emissor.Removelistener (evento, ouvinte)
Vamos dar uma olhada em uma cena fracassada primeiro ~~~
A cópia do código é a seguinte:
var eventEMitter = requer ('eventos'). EventEmitter;
var ee = new EventEmitter ();
ee.on ('alguns_events', função (foo, bar) {
console.log ("1º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
});
/*
Quando vi o método de remoção do removener na API, pensei que deveria ser assim
Mas o resultado^_^!!!
*/
ee.Removelistener ('Some_Events', function () {
console.log ('Evento removido com sucesso, alguns_events escuta!');
});
console.log ('primeira rodada');
ee.emit ('Some_Events', 'Wilson', 'Zhong');
Emissor.Removelistener (evento, ouvinte) CEDIO DE Falha de falha do Código -fonte
Quando registrei um ouvinte para alguns_events usando o emissor.on, usei o emissor.Removelistener para remover algum ouvinte de algum_events e depois chamei emissor.emit para acionar. Finalmente, descobri que não estava prosseguindo como imaginei! Por que?
Naturalmente, acho que o segundo parâmetro do Emiiter.Removelistener é uma função de retorno de chamada, para que a API seja cuidadosamente lida! ! !
Vamos ver outra cena de sucesso ~~~
A cópia do código é a seguinte:
var eventEMitter = requer ('eventos'). EventEmitter;
var ee = new EventEmitter ();
Var Livener = Função (Foo, Bar)
{
console.log ("1º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
}
VAR Livener2 = função (Foo, bar)
{
console.log ("2º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
}
Var Livener3 = Função (Foo, Bar)
{
console.log ("3º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
}
ee.on ('alguns_events', ouvinte);
ee.on ('alguns_events', ouvinte2);
ee.on ('alguns_events', ouvinte3);
/*
EventEmitter.Removelistener (evento, ouvinte) remove o ouvinte para o evento especificado
Nota: o ouvinte deve ser registrado
PS: Após o exemplo anterior, ele falhará. A grande razão é que o ouvinte é ignorado. É natural pensar que não há problema em passar o nome do evento, por isso é uma tragédia!
*/
ee.Removelistener ('Some_Events', ouvinte);
ee.Removelistener ('Some_Events', ouvinte3);
ee.emit ('Some_Events', 'Wilson', 'Zhong');
Emissor.Removelistener (Evento, ouvinte) Cenário de sucesso do cenário de sucesso Código fonte
Usei o método de escrita de exemplo, adicionei três ouvintes a alguns_events, removi o primeiro e o terceiro ouvintes e finalmente acionei alguns_events com emissor.emit. O resultado da saída não é difícil descobrir que o primeiro e o terceiro ouvintes removidos com o emissor.Removelistener não funcionou mais.
Claro, é prejudicial para as pessoas. Acontece que o segundo parâmetro do emissor.Removelistener é o ouvinte a ser removido, em vez da função de retorno de chamada após a remoção bem -sucedida ...^_^!
Emissor.removealllisteners ([Evento])
Emissor.Removelistener tem sido usado, mas um evento pode ter vários ouvintes. Quando todos precisam ser removidos, obviamente não é uma maneira agradável de removê -los uma a uma, e não está em conformidade com a natureza de ser preguiçoso!
Vamos experimentar a conveniência trazida por emissor.RemoveAlllisterners!
A cópia do código é a seguinte:
var eventEMitter = requer ('eventos'). EventEmitter;
var ee = new EventEmitter ();
Var Livener = Função (Foo, Bar)
{
console.log ("1º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
}
VAR Livener2 = função (Foo, bar)
{
console.log ("2º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
}
ee.on ('alguns_events', ouvinte);
ee.on ('alguns_events', ouvinte2);
ee.on ('outros_events', função (foo, bar)
{
console.log ("Outros eventos de escuta, parâmetro foo =" + foo + ", bar =" + bar);
});
/*
EventEmitter.RemoveAlLlistenners ([Evento]) Remove (evento em lote) Todos os ouvintes
Parâmetro 1: parâmetro opcional, string de eventos, nome do evento
*/
ee.RemoveAlllisteners ('Some_Events');
ee.emit ('Some_Events', 'Wilson', 'Zhong');
ee.emit ('outros_events', 'Wilson', 'Zhong');
Emissor.RemoveAlLlisteners Exemplo de código -fonte para o parâmetro de nome do evento recebido
Olhando para os resultados de execução acima, você descobrirá que dois ouvintes foram registrados para alguns_events; Um ouvinte foi registrado para outros_events; Liguei para o emissor.RemoveAlllisteners para passar no nome do evento de alguns_events;
Por fim, use a função Emissor.On para acionar dois eventos: Some_Events e outros_events. Por fim, verifica -se que os dois ouvintes registrados por alguns_events não existem, enquanto os ouvintes registrados por outros_events ainda existem;
Isso significa que, quando Emissor.RemoveAlllisteners passa com o nome do evento como parâmetro, todos os ouvintes que passarem no nome do evento serão removidos sem afetar outros ouvintes de eventos!
Emissor.RemoveAlllistenners podem ser usados sem passar os parâmetros de nome do evento; executar diretamente
A cópia do código é a seguinte:
var eventEMitter = requer ('eventos'). EventEmitter;
var ee = new EventEmitter ();
Var Livener = Função (Foo, Bar)
{
console.log ("1º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
}
VAR Livener2 = função (Foo, bar)
{
console.log ("2º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
}
ee.on ('alguns_events', ouvinte);
ee.on ('alguns_events', ouvinte2);
ee.on ('outros_events', função (foo, bar)
{
console.log ("Outros eventos de escuta, parâmetro foo =" + foo + ", bar =" + bar);
});
/*
EventEmitter.RemoveAlLlistenners ([Evento]) Remove (evento em lote) Todos os ouvintes
Parâmetro 1: parâmetro opcional, string de eventos, nome do evento
*/
ee.RemoveAlllisteners ();
ee.emit ('Some_Events', 'Wilson', 'Zhong');
ee.emit ('outros_events', 'Wilson', 'Zhong');
Emissor.RemoveAlLlisteners Código -fonte da amostra sem parâmetros de passagem
O código de amostra é quase o mesmo que quando passa em parâmetros, exceto que, ao chamar emissor.RemoveAlllisteners, nenhum nome de evento especificado é passado;
A execução dos resultados descobrirá que alguns ouvintes e outros ouvintes não existem mais e removerão todos os ouvintes! (Métodos mais violentos devem ser usados com cautela ~~)
emissor.listeners (evento)
A cópia do código é a seguinte:
var eventEMitter = requer ('eventos'). EventEmitter;
var ee = new EventEmitter ();
Var Livener = Função (Foo, Bar)
{
console.log ("1º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
}
VAR Livener2 = função (Foo, bar)
{
console.log ("2º evento de escuta, parâmetro foo =" + foo + ", bar =" + bar);
}
ee.on ('alguns_events', ouvinte);
ee.on ('alguns_events', ouvinte2);
ee.on ('outros_events', função (foo, bar)
{
console.log ("Outros eventos de escuta, parâmetro foo =" + foo + ", bar =" + bar);
});
/*
EventEmitter.Listeners (Evento) // Retorna a matriz de escuta para o evento especificado
Parâmetro 1: string de eventos, nome do evento
*/
var ouvirerentsarr = ee.listeners ('alguns_events');
console.log (ouvistão.
for (var i = ouvistEVENTSARR.Length-1; i> = 0; i--) {
console.log (ouvidoseventr [i]);
};
Emissor.Listeners (Evento) Código -fonte de amostra
Registre dois ouvintes para alguns_events, ligue para o emissor.listeners function, passe em algum nome de evento de algum_events e receba o valor de retorno da função;
A partir dos resultados, podemos ver que o valor de retorno recebe uma coleção de todas as audições registradas para alguns_events!
emissor.setMaxListeners (n)
É verdade que um evento pode adicionar vários ouvintes, mas qual é o valor máximo padrão do NodeJS?
A cópia do código é a seguinte:
var eventEMitter = requer ('eventos'). EventEmitter;
var ee = new EventEmitter ();
/*
Adicione 11 ouvintes ao EventEmitter
*/
for (var i = 10; i> = 0; i--) {
ee.on ('alguns_events', function ()
{
console.log ('th' +(i +1) +'ouvinte');
});
};
Adicione n Códigos de origem de amostra de escuta
No exemplo acima, usei um loop para adicionar 11 ouvindo alguns_events, executei o código e descobri que as informações de aviso apareceram, e o prompt foi mais detalhado, então preciso usar o emissor.setMaxListeners () para aumentar o limite.
A cópia do código é a seguinte:
var eventEMitter = requer ('eventos'). EventEmitter;
var ee = new EventEmitter ();
/*
EventEmitter.setMaxListeners (n) Defina a máxima audição para o EventEmitter
Parâmetro 1: N Tipo de número, número máximo de ouvintes
Quando houver mais de 10 ouvintes, o número máximo de ouvintes para o EventEmitter será solicitado:
(Nó) Aviso: Possível vazamento de memória do EventEmitter detectado. 11 ouvintes adicionados.
Use emissor.setMaxListeners () para aumentar o limite.
O designer acredita que muitos ouvintes podem levar a vazamentos de memória, então há um aviso tão
*/
ee.setMaxListeners (15);
/*
Adicione 11 ouvintes ao EventEmitter
*/
for (var i = 10; i> = 0; i--) {
ee.on ('alguns_events', function ()
{
console.log ('th' +(i +1) +'ouvinte');
});
};
emissor.setMaxListeners Código -fonte de amostra
Quando eu chamo o emissor.SetMaxListeners para passar em 15, o código é executado e as informações de aviso não aparecem mais;
A função do emitter.setMaxListeners é definir o número máximo de ouvintes para o EventEmitter. Parece que você não precisa definir esse valor. Deve haver menos casos em que 10 não é suficiente!
O designer pensou que muitos ouvintes causariam vazamentos de memória, então ele deu um aviso!
outro...
Não vou entrar em detalhes se usar menos
EventEmitter.DefaultMaxListenners
A função EventEmitter.DefaultMaxListeners é semelhante ao setMaxListeners.
Defina a audição máxima para todos os EventEmitters
A prioridade do setMaxListeners é maior que o defaultmaxListeners
EventEmitter.ListenerCount (Emissor, Evento)
Retorna o número de ouvintes para o evento especificado
Erro de evento especial
Citação do Guia de Desenvolvimento Node.js: EventEmitter Define um erro de evento especial, que contém a semântica de "Erro". Normalmente, emitimos um evento de erro ao encontrar exceções. Quando um erro é emitido, o EventEmitter especifica que, se não houver um ouvinte de resposta, o Node.js o tratará como uma exceção, saia do programa e imprima a pilha de chamadas. Geralmente, precisamos configurar os ouvintes para objetos que emitem eventos de erro para evitar que todo o programa trava após encontrar erros.
Herança de eventos
Vamos falar sobre isso mais tarde no UTIL. Se você estiver interessado, pode conferir sozinho http://nodejs.org/api/util.html#util_util_inerits_constructor_superconstructor