3

クエリを実行して一連の結果を返す非同期メソッドがあるとします。

Task<IEnumerable<Foo>> FetchResultSet();

そして、結果セットを再度フェッチする必要があるたびに起動するオブザーバブルがあります。

IObservable<Unit> NeedToRefetch;

私が欲しいのは:

IObservable<IEnumerable<Foo>>

(1) クエリを実行して最初の結果セットを生成し、(2) 起動するたびNeedToRefetchにクエリを再度実行して別の結果セットを生成します。

このオブザーバブルを構成する最良の方法は何ですか?

その最初の結果セットが必要ない場合は、次のようにすることができます。

NeedToRefetch
    .Select(_ => Observable.FromAsync(() => FetchResultSet()))
    .Concat();

したがって、クエリが少なくとも 1 回実行されるようにするには、次のようにします。

Observable.Return(Unit.Default)
    .Merge(NeedToRefetch)
    .Select(_ => Observable.FromAsync(() => FetchResultSet()))
    .Concat();

しかし、その後、コールド オブザーバブルとホット オブザーバブルについて読み始め、代わりに次のようなことをすべきかどうか疑問に思いました。

var initial = Observable.FromAsync(() => FetchResultSet());
var later = NeedToRefetch
    .Select(_ => Observable.FromAsync(() => FetchResultSet()))
    .Concat();
initial
    .Merge(later);

そして、これは私が使用することになっているケースであるかどうか疑問に思いました Observable.Create.

そして、私は疑問に思うのをやめて、この質問を書きました。

4

1 に答える 1