我个人会避免使用 Do 语句。
您可能会创建一个投影。
在这个投影中,我假设您想要对当前内部序列的处置采取行动(也许从表中清除当前记录?)
MagicSource(StringsProvider)
.Select(inner=>inner.Finally(CleanUp))
.Switch()
.Subscribe(r => {/*...*/});
如果您想做同样的事情,但针对内部序列的订阅(而不是处置),那么您还有更多工作要做。我将创建对称运算符到最后,Initially(Action)
public static class ObservableEx
{
public static IObservable<T> Initially<T>(this IObservable<T> source, Action onSubscribe)
{
return Observable.Create<T>(o=>{
try
{
onSubscribe();
return source.Subscribe(o);
}
catch (Exception ex)
{
o.OnError(ex);
return Disposable.Empty;
}
});
}
}
然后你可以像这样使用它
MagicSource(StringsProvider)
.Select(inner=>inner.Initially(Prepare))
.Switch()
.Subscribe(r => {/*...*/});