ページ分割を含むいくつかのRESTful検索エンドポイントと話しています。クエリは、ユーザが検索フィールドに入力することによってトリガされ、その結果、N個の結果ページに対応するN値のObservableが生成されます。RxJS:N値を生成するswitchMapを使用した背圧
コードは多少、以下のようになります。今
function runQueries(queryObservable) {
return queryObservable
.debounceTime(500)
.distinctUntilChanged()
.switchMap(search);
}
function search(query) {
return Observable.create(observer => searchInto(observer, query, 0));
}
function searchInto(observer, query, start) {
runQuery(query, start).subscribe(result => {
observer.next(result);
if (hasMorePages(result)) {
searchInto(observer, query, start + 1);
} else {
observer.complete();
}
});
}
、検索要求にはしばらく時間がかかることができ、ユーザーがクエリを変更した場合、私はすべてのページを取得する必要はありません。
検索で3ページが返され、1ページが読み込まれた後にユーザーがクエリを変更したとします。
USER: types query A
CODE: loads page A1
USER: types query B
CODE: loads page B1
CODE: loads page B2
CODE: loads page B3
switchMap
は仕事の半分を取得します。私のようなものを見てみたいです。得られた観測値は、A1、B1、B2、B3という正しい順序を持ちます。すばらしいです。
しかし、私の再帰的な検索では依然としてすべてのクエリが実行されており、サーバー、ネットワークなどに不必要な負荷がかかります。switchMap
は「古い」結果を破棄しますが、再帰関数が終わりまで働きなさい。言い換えれば、それは次のようになります:
USER: types query A
CODE: loads page A1 -> returned by search observable
USER: types query B
CODE: loads page A2 -> discarded by search observable
CODE: loads page B1 -> returned by search observable
CODE: loads page B2 -> returned by search observable
CODE: loads page A3 -> discarded by search observable
CODE: loads page B3 -> returned by search observable
"A"と "B"のシーケンスはランダムです(競合条件に従います)が、問題はありません。
私は間違っていますか?これに対する慣用的な解決策は何ですか?
あなたがHTTP要求を行うために何を使うのですか?あなたのソリューションでは、Observableをどこから取り消すのか分かりません。この例のようにhttps://jsfiddle.net/_alexander_/r1tahjqe/3/には、httpリクエスト –
@AlexanderTについての 'return()=> request.abort();'というコードがあります。それはちょうど質問ですが、Observableを "取り消す"ことはできますか?逆方向のメッセージを渡すので、再帰的なプロデューサはそれ以上クエリを実行すべきではないことを知っていますか? 私はAngular2 HTTPまたはカスタムHTTPクライアントでHTTPリクエストを作成しています。私はそれが関係しているとは思わない。 –