Несколько подписок без пересчета общей части - PullRequest
0 голосов
/ 11 июля 2019
const ex = ajax.getJSON('https://httpbin.org/get?a=24');
ex.pipe(pluck('args')).subscribe(x => console.log('Args: ', x));
ex.pipe(pluck('headers')).subscribe(x => console.log('Headers: ', x));

Код выше ( StackBlitz ) инициирует два запроса ajax по одному для каждой подписки.

Как правильно инициировать только одну наблюдаемую трубу / цепочку для всех существующих подписок?

Я могу добиться этого, введя Обещание для ajax ( StackBlitz ):

const p = new Promise(resolve => {
  ajax.getJSON('https://httpbin.org/get?a=24')
  .subscribe(res => resolve(res));
});

from(p).pipe(pluck('args')).subscribe(x => console.log('Args: ', x));
from(p).pipe(pluck('headers')).subscribe(x => console.log('Headers: ', x));

Но я считаю, что должен быть более удобный способ.

Ответы [ 2 ]

4 голосов
/ 11 июля 2019

shareReplay из комментариев решает мою проблему:

const src = tag => of(42)
  .pipe(tap(_ => console.info(tag, 'source called')));

const ex = src('shareReplay').pipe(
  shareReplay(1)
);

ex.subscribe(x => console.log('sa:', x));
ex.subscribe(x => console.log('sb:', x));
shareReplay source called
sa: 42
sb: 42

Полная демонстрация

2 голосов
/ 11 июля 2019

Для этого вы можете использовать оператор публикации :

const ex = ajax.getJSON('https://httpbin.org/get?a=24').pipe(publish());
ex.pipe(pluck('args')).subscribe(x => console.log('Args: ', x));
ex.pipe(pluck('headers')).subscribe(x => console.log('Headers: ', x));
ex.connect();

Запрос Ajax будет выполнен только один раз и только после вызова метода connect() ( stackblitz demo ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...