假设我有一个运行查询并返回一组结果的异步方法:
Task<IEnumerable<Foo>> FetchResultSet();
而且我有一个可观察的,只要需要再次获取结果集就会触发:
IObservable<Unit> NeedToRefetch;
我想要的是:
IObservable<IEnumerable<Foo>>
这将 (1) 运行查询并产生一个初始结果集,以及 (2) 每次NeedToRefetch
触发时,再次运行查询并产生另一个结果集。
组成这个 observable 的最好方法是什么?
如果我不需要那个初始结果集,我可以这样做:
NeedToRefetch
.Select(_ => Observable.FromAsync(() => FetchResultSet()))
.Concat();
因此,为了确保查询至少运行一次,我可以这样做:
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
。
然后我停止了思考并写下了这个问题。