Sollte ein Ereignis-Listener aufgerufen werden, wenn er angehängt ist, nachdem das Ereignis bereits ausgelöst wurde? Was ist, wenn das Ereignis nur einmal ausgelöst wird?
Das erste Beispiel, das mir in den Sinn kommt, ist das ready
Ereignis in jQuery. Das folgende Snippet ruft nach dem Laden der Seite den Rückruf auf:
$(document).ready(function () {
console.log("Works.");
});
Die Alternative zu diesem Verhalten könnte ein Flag sein, das beim Laden der Seite gesetzt wird und den Verbraucher der API dazu zwingt, zu überprüfen, ob das Ereignis bereits eingetreten ist, und entsprechend zu handeln:
if (document.readyState == "complete") {
console.log("Works.");
} else {
$(document).ready(function () {
console.log("Works.");
});
}
Während das obige Beispiel im Zusammenhang mit dem Laden einer Webseite steht, bei der (normalerweise) alles und jedes geschehen muss, nachdem die Seite vollständig geladen wurde, können dieselben Argumente für jede einzelne Komponente in einer Anwendung mit "Singleton" -Ereignissen vorgebracht werden ( load
, start
, end
, usw.). Ein Beispiel für eine einzelne Komponente könnte eine Karte mit einem load
Ereignis sein , das ausgelöst wird, um anzugeben, dass die Karte geladen wurde :
map.on("load", function () {
console.log("The map has loaded.");
});
Das obige Beispiel stammt aus der ArcGIS-API für JavaScript, in der dieses Ereignis nur einmal ausgelöst wird. Wenn ein Verbraucher darauf wartet, dass die Karte geladen wird, nachdem die Karte bereits geladen wurde, wird der Listener niemals aufgerufen. Für das gewünschte Ergebnis muss der Status der Karte überprüft werden, bevor der Listener angehängt wird:
if (map.loaded) {
console.log("The map has loaded.");
} else {
map.on("load", function () {
console.log("The map has loaded.");
});
}
Welches Verhalten ist korrekt, wenn der Verbraucher überprüfen muss, ob ein Ereignis bereits ausgelöst wurde, oder immer den Rückruf aufruft?
Subject
vs. interessiert seinReplaySubject
, bei denen letzterer frühere Ereignisse für späte Abonnenten wiedergibt, während ersterer dies nicht tut. Das heißt, die Entwickler von Rx haben beide Verhaltensweisen modelliert, anstatt sich für ein bestimmtes Verhalten zu entscheiden. - Während die obigen Links zur Dokumentation der .NET-Version von Rx führen, gibt es auch einen Rx für JavaScript .