2014-04-01 110 views
4

我想在IObservable<T>上訂閱並取消訂閱(dipose)收到T類型的第一個元素之後的訂閱權限,即我只想在獲得的第一個元素後調用操作訂閱。訂閱並立即取消訂閱第一個動作

這是我想出了辦法:

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開箱即用的擴展方法?

回答

13
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處理。

+0

哇......不知道爲什麼我忘記了「Take」! (和'Skip'等等)感謝您的迴應! –