假设我有一个运行查询的异步方法 并返回一组结果:
Task<IEnumerable<Foo>> FetchResultSet();
我有一个可观察到的东西,无论什么时候发射 结果集需要再次获取:
IObservable<Unit> NeedToRefetch;
我想要的是:
IObservable<IEnumerable<Foo>>
哪个(1)运行查询并产生一个初始值
结果集,(2)每次NeedToRefetch
触发,运行
再次查询并产生另一个结果集。
构成这种观察结果的最佳方法是什么?
如果我不需要初始结果集,我可以这样做:
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
。
然后我就不再想知道并写下这个问题了。
答案 0 :(得分:1)
我会说你几乎就在那里。您可以使用原始方法。要立即运行一次,您可以添加StartWith()
:
NeedToRefetch
.StartWith(Unit.Default)
.Select(_ => Observable.FromAsync(() => FetchResultSet()))
.Concat();