2016-09-20 19 views
8

Khi sử dụng đường ống async trên quan sát đang sử dụng toán tử .share() (do tính toán đắt tiền trong chương trình phụ trợ), tôi tình cờ gặp hành vi này:Góc 2 + rxjs: đường ống không đồng bộ với toán tử .share()

data$ = (new Observable(observer => { 
    let counter=0; 
    observer.next(counter) 

    window.setInterval(() => { 
     observer.next(counter); 
     counter++; 
    }, 2000); 
    })) 
    .share(); 

mẫu:

{{ (data$|async) !== null }} 
{{ (data$|async) !== null }} 

đầu ra của giá trị ban đầu là:

true false 

các kết quả sau (sau hơn 2 giây) là:

true true 

cũng là hành vi mà tôi mong đợi cho giá trị đầu tiên. Nếu tôi bỏ qua .share(), đầu ra cho giá trị đầu tiên là "true true", như tôi mong đợi. Tôi cho rằng hành vi trên là do biểu thức đầu tiên trong mẫu kích hoạt thực thi quan sát được và khi ống async thứ hai đăng ký với dữ liệu quan sát được, dữ liệu đã biến mất. Lời giải thích này có đúng không? Và làm thế nào tôi có thể tránh được hành vi này?

+0

Vì có được coi là một giá trị duy nhất, đó là 'observer.next (...); observer.complete() '. – estus

+0

ví dụ với một giá trị duy nhất chỉ dành cho trình diễn, trong ứng dụng của tôi có thể quan sát được có nhiều giá trị – highwaychile

+0

Vui lòng cung cấp mã phản ánh trường hợp của bạn sau đó. – estus

Trả lời

12

Theo the reference,

Các đăng ký cao ống async đến một Quan sát hoặc Promise và trả về giá trị mới nhất của nó đã phát ra.

Trong RxJS 4, shareReplay được sử dụng để đạt được hành vi mong muốn.

Trong RxJS 5, một đối tác trực tiếp đến shareReplaypublishReplay tiếp theo refCount (see the explanationthe discussion).

Vì vậy, nó phải được

data$ = (new Observable(observer => { ... })) 
.publishReplay(1) 
.refCount(); 
Các vấn đề liên quan