Rxjs 按一定顺序查找邮件

Rxjs 按一定顺序查找邮件,rxjs,reactive-programming,system.reactive,rx.net,Rxjs,Reactive Programming,System.reactive,Rx.net,我已经开始研究ReactiveX,但无法确定它是否适合我试图解决的问题,因为我现在对ReactiveX了解不够,或者它没有我需要的东西 假设我经常收到20种不同类型的消息。所有消息应首先保存到数据库中。那么我需要进一步的分析。我对A型、B型、C型和D型的顺序很感兴趣(不必一个接一个)。当消息出现时,应将其视为我需要触发的进程的开始。然后我应该等待消息B(任何其他消息类型都可以在等待时到达)到达并执行流程中的步骤。在消息B之后,我等待消息C并执行流程中的步骤。然后,我等待标志着进程结束的消息D。然

我已经开始研究ReactiveX,但无法确定它是否适合我试图解决的问题,因为我现在对ReactiveX了解不够,或者它没有我需要的东西

假设我经常收到20种不同类型的消息。所有消息应首先保存到数据库中。那么我需要进一步的分析。我对A型、B型、C型和D型的顺序很感兴趣(不必一个接一个)。当消息出现时,应将其视为我需要触发的进程的开始。然后我应该等待消息B(任何其他消息类型都可以在等待时到达)到达并执行流程中的步骤。在消息B之后,我等待消息C并执行流程中的步骤。然后,我等待标志着进程结束的消息D。然后我需要重新开始,等待消息A启动新流程

我使用的是.NET,但任何平台的代码都可以确定如何(或是否)实现这一点

更新:提供更多上下文

使用@Enigmativity示例代码,我将尝试稍微扩展这个问题。信息是由设备产生的。所以我们假设在“A1,B2,B1,C1,F3,…”流中,第一个字母是消息类型,数字是设备的ID。因此,消息A、B、C和D需要来自同一个设备才能被视为匹配。服务器总是获取所有消息,因为设备将重复这些消息,直到得到确认。这是单个设备可以产生的(流可以包含来自所有设备的混合消息):

A1,B1,H1,F1,A1-在完成任何操作之前,设备重新启动。首先,A1,B1应该被忽略,我们现在重新开始等待A,B,C和D


A1、B1、C1、B1-这不可能发生。A1总是在B、C或D之前出现。有时它可能不会到达D,但随后它会重新开始。

Rx.NET
的API跟踪
RxJS
而言,这很简单。假设我们已经可以观察到所有消息:

constoftype=theType=>filter(({type})=>type==theType);
const a$=messages$.pipe(类型为('a'));
const b$=messages$.pipe(类型为('b'));
const c$=messages$.pipe(类型为('c'));
const d$=messages$.pipe(类型为('d'));
const handle$=b$.pipe(取(1),concatMap(bMsg=>/*执行b步骤*/);
const handleC$=c$.pipe(取(1),concatMap(cMsg=>/*执行c步骤*/);
常数waitForD$=d$管道(取(1));
const进程$=a$.pipe(
//当我们处理此“a”消息时,忽略其他“a”消息
排气图((aMsg)=>{
//这些将按顺序执行。完成后,我们返回
//侦听“a”消息
返回concat(handleB$、handleC$、waitForD$);
})
);
请注意,
process$
是一个可观察对象,它将发出“b”和“c”步骤的结果以及“d”消息。如果愿意,可以忽略或抑制此输出



我发现Rx.NET可能缺少一个exhaustMap实现。解决这个问题。

根据您的描述,我不确定您是否能够保证始终获得每个消息类型A、B、C和D,而不会获得另一组或重叠的值。例如,如果在最后一个D之前出现第二个a,我有两种方法来防止重新启动出现问题

以下是我的基本代码设置:

var subject = new Subject<string>();

IObservable<(string a, string b, string c, string d)> query = ...

query.Subscribe(x => Console.WriteLine($"{x.a} {x.b} {x.c} {x.d}"));

"A1,B1,A2,C1,F1,D1,A3,A4,B2,B3,A5,C2,B4,F2,D2,D3,C3,D3"
    .Split(',')
    .ToObservable()
    .Subscribe(subject);
都很好,一对一对

第二个是:

A1 B1 C1 D1
A2 B2 C2 D2
A3 B3 C3 D3
A1 B1 C1 D1
A4 B3 C2 D2
A4 B3 C2 D3
A5 B4 C3 D3

谢谢你的回答。我学到了很多!既然你提到了重叠值的问题,我将更新我的问题,提供更多的上下文,这样也许你可以帮我更多。
A1 B1 C1 D1
A2 B2 C2 D2
A3 B3 C3 D3
A1 B1 C1 D1
A4 B3 C2 D2
A4 B3 C2 D3
A5 B4 C3 D3