在学习 Rx 时,我遇到了一个经常重复的关于Observables的规则,该规则在The Observable Contract中有详细说明。
在发出 OnCompleted 或 OnError 通知后,它可能不会再发出任何进一步的通知。
这对我来说很有意义,因为让 Observable 在完成后继续产生值会令人困惑,但是当我在 .NET 中测试 Observable.Range 方法时,我注意到它没有表现出这种行为,事实上许多Observable 违反了这条规则。
var rangeObservable = Observable.Range(0, 5);
rangeObservable.Subscribe(Console.WriteLine, () => Console.WriteLine("Done first!"));
Console.ReadLine();
rangeObservable.Subscribe(Console.WriteLine, () => Console.WriteLine("Done second!"));
Console.ReadLine();
//Output:
//0
//1
//2
//3
//4
//Done first!
//0
//1
//2
//3
//4
//Done second!
显然在第一次之后rangeObservable
调用OnComplete
了两次并产生了值OnComplete
。这让我相信这不是关于Observables的规则,而是关于Subscriptions的规则。也就是说,一个Observable可以产生任意多的终止消息,甚至在它产生之后产生值,只要每个Subscription只接收一个终止消息并且之后不再接收任何消息。
当它说Observable时,它们实际上是指Subscription吗?它们真的是不同的东西吗?我对模型有根本的误解吗?