イベントがすでに発生した後に接続されている場合、イベントリスナーを呼び出す必要がありますか?イベントが一度だけ発生する場合はどうなりますか?
頭に浮かぶ最初の例は、ready
jQuery のイベントです。次のスニペットは、ページが読み込まれた後に評価されると、コールバックを呼び出します。
$(document).ready(function () {
console.log("Works.");
});
この動作の代わりに、ページが読み込まれたときに設定されるフラグを使用して、APIのコンシューマーに、イベントがすでに発生しているかどうかを確認し、それに応じて動作するように強制することができます。
if (document.readyState == "complete") {
console.log("Works.");
} else {
$(document).ready(function () {
console.log("Works.");
});
}
上記の例は、ページが完全にロードされた後に何でも(通常は)すべてを実行する必要があるWebページのロードのコンテキストですが、「singleton」イベントを持つアプリケーションの単一のコンポーネントに対して同じ引数を作成できます(load
、start
、end
、など)。単一成分の例は、とマップすることができload
、イベント起動マップが読み込まれ、そのように指定すること。
map.on("load", function () {
console.log("The map has loaded.");
});
上記の例は、ArcGIS API for JavaScriptからのもので、そのイベントは1回だけ発生します。コンシューマーがマップがロードされた後にマップがロードされるのを「待機」した場合、リスナーは呼び出されません。望ましい結果を得るには、リスナーをアタッチする前にマップの状態を確認する必要があります。
if (map.loaded) {
console.log("The map has loaded.");
} else {
map.on("load", function () {
console.log("The map has loaded.");
});
}
イベントが既に発生しているか、または常にコールバックを呼び出しているかどうかをコンシューマーに要求する正しい動作はどれですか。
Subject
対ReplaySubject
前者がないのに対し、後半の加入者のために後者のリプレイ前のイベント。つまり、Rxの作成者は、1つの明確な動作を決定するのではなく、両方の動作をモデル化しました。-上記のリンクはRxの.NETバージョンのドキュメントに移動しますが、JavaScript用のRxもあります。