2016-09-20 2 views
8

При использовании асинхронной трубки на наблюдаемой, которая использует оператор .share() (из-за дорогостоящих вычислений в бэкэнд), я наткнулся на это поведение:Угловая 2 + rxjs: асинхронная трубка с оператором .share()

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

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

Шаблон:

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

выходной сигнал начального значения является:

true false 

следующие выходы (после более чем 2 секунд):

true true 

Это поведение, которое я ожидал бы от первого значения. Если я опускаю .share(), вывод для первого значения будет «true true», как и следовало ожидать. Я полагаю, что вышеизложенное поведение связано с тем, что первое выражение в шаблоне вызывает наблюдаемое выполнение, и как только второй асинхронный канал подписывается на наблюдаемый, данные уже исчезли. Правильно ли это объяснение? И как я могу избежать такого поведения?

+0

Поскольку предполагается, что одно значение, то 'observer.next (...); observer.complete() '. – estus

+0

пример с единственным значением был только для демонстрации, в моем приложении наблюдаемое имеет несколько значений – highwaychile

+0

Пожалуйста, укажите код, который отражает ваше дело. – estus

ответ

12

Согласно the reference,

В асинхронной трубе выписывает к наблюдаемому или Promise и возвращают последнее значение оно излучаемое.

В RxJS 4, shareReplay используется для достижения желаемого поведения.

В RxJS 5, прямой аналог shareReplay является publishReplay с последующим refCount (see the explanation и the discussion).

Так оно и должно быть

data$ = (new Observable(observer => { ... })) 
.publishReplay(1) 
.refCount(); 
Смежные вопросы