Um ouvinte de evento deve ser chamado se estiver anexado depois que o evento já foi acionado? E se o evento for disparado apenas uma vez?
O primeiro exemplo que vem à mente é o ready
evento no jQuery. O seguinte snippet, quando avaliado após o carregamento da página, ainda chamará o retorno de chamada:
$(document).ready(function () {
console.log("Works.");
});
A alternativa para esse comportamento pode ser um sinalizador definido quando a página é carregada, forçando o consumidor da API a verificar se o evento já aconteceu e agir de acordo:
if (document.readyState == "complete") {
console.log("Works.");
} else {
$(document).ready(function () {
console.log("Works.");
});
}
Enquanto o exemplo acima está no contexto de um carregamento de página da Web em que tudo e qualquer coisa (geralmente) precisa acontecer após o carregamento completo da página, os mesmos argumentos podem ser feitos para qualquer componente em um aplicativo que possua eventos "singleton" ( load
, start
, end
, etc.). Um exemplo de um único componente pode ser um mapa com um load
evento acionado para especificar que o mapa foi carregado :
map.on("load", function () {
console.log("The map has loaded.");
});
O exemplo acima vem da API do ArcGIS para JavaScript, onde esse evento é acionado apenas uma vez e, se um consumidor "espera" o carregamento do mapa após o carregamento do mapa, o ouvinte nunca será chamado. O resultado desejado requer a verificação do estado do mapa antes de o ouvinte ser anexado:
if (map.loaded) {
console.log("The map has loaded.");
} else {
map.on("load", function () {
console.log("The map has loaded.");
});
}
Qual comportamento está correto, exigindo que o consumidor verifique se um evento já foi acionado ou sempre chamando o retorno de chamada?
Subject
vs.ReplaySubject
, onde os eventos dos últimos replays anteriores para assinantes final enquanto o primeiro não. Ou seja, os criadores do Rx modelaram os dois comportamentos, em vez de decidirem um comportamento definido. - E enquanto os links acima vão para a documentação da versão .NET do Rx ', há também um Rx para JavaScript .