3

假设我有一个运行查询并返回一组结果的异步方法:

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

然后我停止了思考并写下了这个问题。

4

1 回答 1

1

我会说你快到了。你可以使用你原来的方法。要使其立即运行一次,您可以包括StartWith()

NeedToRefetch
    .StartWith(Unit.Default)
    .Select(_ => Observable.FromAsync(() => FetchResultSet()))
    .Concat();
于 2017-07-19T05:53:48.290 回答