通知とキャプチャ
通知とキャプチャの実装は非常に簡単です。キャプチャによって渡されたハンドラを保存し、通知で一致するハンドラを見つけるだけです。
var filterHandlerBundles = []
; Dispatch.capture = function(pattern, handler) {
var filter = createFilter(pattern);
filterHandlerBundles.push({
"filter": フィルター,
"handler": ハンドラー
});
};
Dispatcher.notify = function(json) {
for (var i = 0; i if (filterHandlerBundles[i]. filter.apply (this, argument)) {
filterHandlerBundles[i].handler(json);
}
}
}; このコードのロジック重要なのは createFilter 部分にあります。この関数は、パターンを記述する JSON を、JSON が一致するかどうかを判断する関数に変換する役割を果たします。
演算子
私たちはたくさんのアルゴリズムを設計しましたが、それらをどのように実装すればよいでしょうか?大文字と小文字を切り替えたくないことに注意してください。したがって、演算子と実装の間のマッピングを保存するために連想配列を使用します。
}
operators["gt"] = function(testValue, value) {
return argument.length == 2 && 値 > testValue;
operators["gte"] = function(testValue, value) {
return argument.length == 2 && value >= testValue; ;
このように、「$」以降の演算子を抽出すれば、対応する判定関数がすぐに見つかります。上記の 4 つは比較演算子であり、実装が比較的簡単であるため、ここでは例として示します。
より難しい関数は eq です。これは、データ型に基づいて特定の判定方法を選択する必要があるためです。文字列、数値、およびブール値の場合、eq の意味は == であり、配列の場合、eq の意味はその中のすべての要素が eq であること、オブジェクトの場合、eq の意味はすべてのサブ要素であることです。条件が満たされるため、各サブ条件の演算子文字列を抽出し、対応する演算子を呼び出す必要があります。詳細については、完全なコードを参照してください。
他の演算子はより単純です。ここではヒントだけを示します。実際のニーズに応じてこれらの演算子のサブセットまたはスーパーセットを使用できます。
in - 配列を走査して、それが見つかるかどうかを確認します。少なくとも 1 つの等量。
all - 配列を走査して、それぞれに eq が存在するかどうかを確認します。
ex - 値が渡された場合、子要素が存在します。
re - 正規表現を使用して、文字列が一致するかどうかを判断します。
ld - 判定用の関数を直接呼び出します。
もう書き終わりましたか?正しく書いたかどうかわかりませんか?これについては次の記事で説明するので、デフォルトの演算子を追加することから始めましょう。
コードをコピー
コードは次のとおりです。
operators[""] = function(testValue 、値) {
}
}; なぜデフォルトの演算子が必要なのでしょうか?これは実際には単なるショートカットです。ほとんどの場合、必要なのは eq 演算です。演算子をあらゆる場所に記述すると、コードは非常に複雑になり、美しくなくなります。 2 つの JSON を比較して、どちらがより自然だと思いますか?
コードをコピー
コードは次のとおりです:
Dispatcher.capture({
" status": 200,
"command": "メッセージ"
}, function(json) { /* メッセージの表示 */ });
Dispatcher.capture({