2016-12-16 1 views
7

Перед обновлением RxJS до 5.0.0-rc.0 Я использовал .cache(), чтобы разделить подписку в моем приложении с угловым выражением. Большим преимуществом в использовании этого было то, что любая новая подписка получит последнее опубликованное значение.RxJS 5 и альтернативы оператору кеша

Команда RxJS решил убрать его, и теперь я считаю себя вручную проводкой личного BehaviorSubject или ReplaySubject и затем вызвать .asObservable() всего времени. Это похоже на много шаблонов, учитывая тот простой способ, которым мы должны были это сделать раньше.

Я пропустил какой-то более простой способ? Я не могу найти оператора .replay(), и операторы .share() и .publishReplay(), похоже, тоже не делают этого.

Спасибо!

ответ

5

Это то, что я использую, чтобы показать RxJS. В следующем примере кэшируется последний издевавшийся HTTP-ответ в течение 1 секунды. Он основан на многоадресной рассылке RxJS через publishReplay() и refCount().

var counter = 1; 
var updateTrigger = Observable.defer(() => mockDataFetch()) 
    .publishReplay(1, 1000) 
    .refCount() 
    .take(1); 

function mockDataFetch() { 
    return Observable.of(counter++) 
     .delay(100); 
} 

function mockHttpCache() { 
    return updateTrigger; 
} 

mockHttpCache().toPromise() 
    .then(val => console.log("Response from 0:", val)); 

setTimeout(() => mockHttpCache().toPromise() 
    .then(val => console.log("Response from 200:", val)) 
, 200); 

setTimeout(() => mockHttpCache().toPromise() 
    .then(val => console.log("Response from 1200:", val)) 
, 1200); 

setTimeout(() => mockHttpCache().toPromise() 
    .then(val => console.log("Response from 1500:", val)) 
, 1500); 

setTimeout(() => mockHttpCache().toPromise() 
    .then(val => console.log("Response from 3500:", val)) 
, 3500); 

Смотреть демо: https://jsbin.com/todude/3/edit?js,console

Это выводит на консоль:

Response 0: 1 
Response 50: 1 
Response 200: 1 
Response 1200: 2 
Response 1500: 2 
Response 3500: 3 
+0

ОК, я получаю свою ошибку прямо сейчас. Я могу использовать 'publishReplay' и' refCount', но если у меня нет подписчика, я могу пропустить/пропустить некоторые из значений базовой последовательности. Я решил это с призывом «подписаться» сразу после этого, но я бы предположил, что это не отличное решение. –

+1

Я сделал сообщение в SO Документация об этом с подробным объяснением, как это работает: http://stackoverflow.com/documentation/rxjs/8247/common-recipes/26490/caching-http-responses#t=201612161544428695958 – martin