2017-01-30 22 views
6

Tại sao publishReplay (1) .refCount() không phát lại giá trị cuối cùng cho người đăng ký trễ?Tại sao Rxjs publishReplay (1) .refCount() không phát lại?

a = new Rx.Subject(); 
 
b = a.publishReplay(1).refCount(); 
 

 
a.subscribe(function(x){console.log('timely subscriber:',x)}); 
 
a.next(1); 
 
b.subscribe(function(x){console.log('late subscriber:',x)});
<script src="http://reactivex.io/rxjs/user/script/0-Rx.js"></script>

sản lượng dự kiến:

timely subscribe: 1 
late subscriber: 1 

Sản lượng thực tế

timely subscriber: 1 

Trả lời

1

thuê bao đầu tiên của bạn đặt mua a, vì refCount đầu tiên kích hoạt dòng khi có ít nhất 1 người đăng ký (trong đó không có ai, bởi vì không phải là b nhưng a được đăng ký), nó không hoạt động cho đến lần cuối cùng của bạn.

a = new Rx.Subject(); 
 
b = a.publishReplay(1).refCount(); 
 

 
b.subscribe(function(x){console.log('timely subscriber:',x)}); 
 
a.next(1); 
 
b.subscribe(function(x){console.log('late subscriber:',x)});
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

9

Điều này xảy ra bởi vì vào thời điểm đó bạn gọi a.next(1) các publishReplay(1) chưa đăng ký nguồn của nó Quan sát (Chủ đề a trong trường hợp này) và do đó nội ReplaySubject sẽ không nhận được giá trị 1.

Trong RxJS 5 đăng ký thực tế giữa các toán tử xảy ra khi bạn đăng ký ở cuối chuỗi là b.subscribe(...) trong ví dụ này. Xem:

Cho đến khi bạn gọi subscribe() các nhà khai thác đang bị xích nhờ lift() phương pháp mà chỉ mất một thể hiện của nhà điều hành và gán nó vào Quan sát mới. Phương thức operator.call() như bạn có thể thấy trong hai liên kết ở trên được gọi sau khi đăng ký. Xem:

Các vấn đề liên quan