我希望在收到IObservable<T>
类型的第一个元素后订阅T
并取消订阅(dipose)订阅,即我只想在我得到的第一个元素上调用该操作订阅后。
这是我提出的方法:
public static class Extensions
{
public static void SubscribeOnce<T>(this IObservable<T> observable, Action<T> action)
{
IDisposable subscription = null;
subscription = observable.Subscribe(t =>
{
action(t);
subscription.Dispose();
});
}
}
使用示例:
public class Program
{
public static void Main()
{
var subject = new Subject<int>();
subject.OnNext(0);
subject.OnNext(1);
subject.SubscribeOnce(i => Console.WriteLine(i));
subject.OnNext(2);
subject.OnNext(3);
Console.ReadLine();
}
}
按预期工作,只打印2
。 这个或其他什么问题有什么不妥吗?是否有一种更清洁的方式使用RX开箱即用的扩展方法?
答案 0 :(得分:16)
var source = new Subject();
source
.Take(1)
.Subscribe(Console.WriteLine);
source.OnNext(5);
source.OnNext(6);
source.OnError(new Exception("oops!"));
source.OnNext(7);
source.OnNext(8);
// Output is "5". Subscription is auto-disposed. Error is ignored.
Take
在nth
元素产生后自动处理订阅。 :)
就其他需要考虑的事项而言,对于您的自定义observable,您应该注意到您可能还希望将OnError和OnCompleted通知传递给您的观察者,Take也可以为您处理。
内置运算符也有其他好处,例如更好的Dispose
处理。