我有一个发布通用消息的服务,我已经为这些消息创建了一个observable。这些消息可以包含任何内容,并且可以在顶层分层不同的协议。
我希望添加第二层可观察来解释这些消息中的特定协议。例如,消息可以是“更新”,“错误”或“完成”类型。我希望重新发布“更新”消息,在“错误”上抛出错误,并在“完成”上完成序列。
我怎样才能干净利落地实现这一目标?
我认为我不能用SelectMany
来做这件事;虽然选择器可以为前两种情况返回Observable.Return()
或Observable.Throw()
,但我无法从选择器中完成(调用observer.OnCompleted()
并取消订阅底层的observable)。
在我看来,我必须使用Observable.Create()
并订阅subscribe方法中的基础observable。我已经做到了,但实现对我来说感觉很奇怪,因为它没有使用在Rx中更常见的功能组合风格。这是正确的方法吗?
public IObservable<Message> InterpretProtocol(IObservable<message> stream)
{
return Observable.Create<Message>(observer =>
{
return stream.Subscribe(message =>
{
switch (ProtocolMessageTypeOf(message))
{
case ProtocolMessageType.Error:
observer.OnError(new InvalidOperationException(message));
break;
case ProtocolMessageType.Complete:
observer.OnCompleted();
break;
default:
observer.OnNext(message);
break;
}
});
});
}
答案 0 :(得分:2)
您可以尝试以下内容:
public IObservable<Message> InterpretProtocol(IObservable<message> stream) {
return stream.
TakeWhile(msg => ProtocolMessageTypeOf(message) != ProtocolMessageType.Complete).
Select(msg => {
if(ProtocolMessageTypeOf(message) == ProtocolMessageType.Error)
throw new InvalidOperationException(message);
else
return msg;
});
}