¿Debe llamarse a un oyente de eventos si está conectado después de que el evento ya se haya disparado? ¿Qué pasa si el evento solo se disparará una vez?
El primer ejemplo que viene a la mente es el ready
evento en jQuery. El siguiente fragmento, cuando se evalúa después de que la página se ha cargado, seguirá llamando a la devolución de llamada:
$(document).ready(function () {
console.log("Works.");
});
La alternativa a este comportamiento podría ser un indicador que se establece cuando se carga la página, lo que obliga al consumidor de la API a verificar si el evento ya sucedió y actuar en consecuencia:
if (document.readyState == "complete") {
console.log("Works.");
} else {
$(document).ready(function () {
console.log("Works.");
});
}
Si bien el ejemplo anterior está en el contexto de una página web que se carga donde cualquier cosa y todo (generalmente) debe suceder después de que la página se haya cargado por completo, se podrían hacer los mismos argumentos para cualquier componente individual en una aplicación, que tiene eventos "únicos" ( load
, start
, end
, etc.). Un ejemplo de un solo componente podría ser un mapa con un load
evento que se dispara para especificar que el mapa que se ha cargado :
map.on("load", function () {
console.log("The map has loaded.");
});
El ejemplo anterior proviene de la API de ArcGIS para JavaScript, donde ese evento se dispara solo una vez, y si un consumidor "espera" que el mapa se cargue después de que el mapa ya esté cargado, nunca se llamará al oyente. El resultado deseado requiere verificar el estado del mapa antes de que se adjunte el oyente:
if (map.loaded) {
console.log("The map has loaded.");
} else {
map.on("load", function () {
console.log("The map has loaded.");
});
}
¿Qué comportamiento es correcto, que requiere que el consumidor verifique si un evento ya se ha activado o siempre está llamando a la devolución de llamada?
Subject
vs.ReplaySubject
, donde este último reproduce eventos anteriores para suscriptores tardíos, mientras que el primero no. Es decir, los creadores de Rx modelaron ambos comportamientos en lugar de decidir sobre un comportamiento definido. - Y aunque los enlaces anteriores van a la documentación de la versión .NET de Rx, también hay un Rx para JavaScript .