react native可观察认购出售事项

如果我可以访问一个我知道只会返回一个项目的IObservable,这是否有效并且它是最好的使用模式?

IDisposable disposable = null; disposable = myObservable.Subscribe(x => { DoThingWithItem(x); if (disposable != null) { disposable.Dispose(); } }); 

免责声明:我还在学习Rx。 所以我不是真正的专家,但我相信Subscribe返回的一次性只会取消订阅订阅。 此外,如果源完成,就像您的情况一样,取消订阅会自动完成。 所以我认为Dispose存在冗余,可以安全地删除。

有关详细信息,请参阅此问题的答案。

Subscribe扩展方法返回的一次性返回仅允许您在观察结果自然结束之前手动取消订阅observable。

如果observable完成 – 使用OnCompletedOnError – 那么订阅已经为您处理。

试试这段代码:

 var xs = Observable.Create(o => { var d = Observable.Return(1).Subscribe(o); return Disposable.Create(() => { Console.WriteLine("Disposed!"); d.Dispose(); }); }); var subscription = xs.Subscribe(x => Console.WriteLine(x)); 

如果你运行上面的内容,你会看到“Disposed!” 当observable完成而不需要调用.Dispose()时,会写入控制台。

需要注意的一件重要事情是:垃圾收集器永远不会在可观察的订阅上调用.Dispose() ,因此如果订阅在订阅超出范围之前没有(或可能没有)自然结束,则必须处置它们。

以此为例,例如:

 var wc = new WebClient(); var ds = Observable .FromEventPattern< DownloadStringCompletedEventHandler, DownloadStringCompletedEventArgs>( h => wc.DownloadStringCompleted += h, h => wc.DownloadStringCompleted -= h); var subscription = ds.Subscribe(d => Console.WriteLine(d.EventArgs.Result)); 

ds observable仅在具有订阅时附加到事件处理程序,并且仅在observable完成或处理订阅时才分离。 因为它是一个事件处理程序,所以observable永远不会完成,因为它正在等待更多的事件,因此处理是从事件中分离的唯一方法(对于上面的例子)。

如果你有一个FromEventPattern observable,你知道它只返回一个值,那么在订阅允许事件处理程序自动分离之前添加.Take(1)扩展方法是明智的,然后你不需要手动处理订阅。

像这样:

 var ds = Observable .FromEventPattern< DownloadStringCompletedEventHandler, DownloadStringCompletedEventArgs>( h => wc.DownloadStringCompleted += h, h => wc.DownloadStringCompleted -= h) .Take(1); 

我希望这有帮助。

Takefunction将完全符合您的要求。 在这种情况下, Take(1)

与一些评论相反,从OnNext内部处理订阅并不罕见。

虽然OnCompletedOnError处理是通过Subscribe扩展方法创建的包装订阅为您完成的,但您可能希望根据您正在观察的值取消订阅(例如在您的情况下:第一个)。 您并不总是有一个已知只生成一个值的observable。

问题是您只有在订阅后才能获得IDisposable 。 即使在它返回IDisposable取消订阅(取决于它使用的IScheduler之类的东西)之前,一个observable可能会回复OnNext

在这种情况下, System.Reactive.Disposables.SingleAssignmentDisposable派上用场。 它包含了一个你可能迟到的IDisposable ,并且如果SingleAssignmentDisposable已经处理了SingleAssignmentDisposable ,它将立即处理它。 它还带有一个属性IsDisposed ,它最初为false并在调用Dispose()时设置为true

所以:

 IObservable source = ...; var subscription = new SingleAssignmentDisposable(); subscription.Disposable = source.Subscribe(x => { if (subscription.IsDisposed) // getting notified though I've told it to stop return; DoThingsWithItem(x); if (x == "the last item I'm interested in") subscription.Dispose(); });