如何在Rx.Net中定义ConcatMap?

时间:2019-06-21 03:03:18

标签: rx.net

Rx.Net到目前为止还没有等效的concatMap,但是在可以使用的功能允许的情况下,可以肯定地有一种类似的行为。我现在有CallFunction () { console.log("Event was called"); } render(){ return( <div>{this.CallFunction()}</div> ); } ,其中observable.SelectMany(x => ProcessItemAsync(item).ToObservable())是一个异步方法,我想按一个顺序执行,而不是一次执行所有项目。

如果我正确理解Rx,ProcessItemAsync应该这样做,但是Rx.Net中目前不存在它,那么实现相同行为的另一种方式是什么?

我可能有多个可观察的源,并且每个源都可以并行执行observable.ConcatMap(x => ProcessItemAsync(item).ToObservable()),它应该只在流顺序内,以保持输入/输出顺序,因此我无法锁定它在ProcessItemAsync

2 个答案:

答案 0 :(得分:0)

编辑:在这里找到了更简单的解决方案:Answer to Reactive Extensions SelectMany and Concat

在下面粘贴到LINQPad进行尝试

onPause

(在原始文章中,我做了一个扩展方法,选择/映射了给定的异步Func。然后我做了一个类,在其中等待结果,对其进行索引和存储,以便按顺序发出结果。)

答案 1 :(得分:-1)

在这里跟进我的评论是建议的解决方案。

相反

.Select(x => LongProcessAsync(x).ToObservable())

使用以下内容:

.Select(x => Observable.Create<int>(async o =>
{
    try
    {
        var result = await LongProcessAsync(x);
        o.OnNext(result);
        o.OnCompleted();
    }
    catch (Exception ex)
    {
        o.OnError(ex);
    }
}))