假设我有一个运行查询的异步方法并返回一组结果:
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
。
然后我不再想知道并写了这个问题。
我会说你快到了。您可以使用原始方法。要使它立即运行一次,您可以包括一个StartWith()
:
NeedToRefetch
.StartWith(Unit.Default)
.Select(_ => Observable.FromAsync(() => FetchResultSet()))
.Concat();