RxJS запускает функцию выбора только один раз

1

Я использую combLatest, который можно наблюдать с двумя потоками и функцией выбора.

const todos = Rx.Observable.of([{
  id: 1,
  completed: false,
  text: 'one'
}, {
  id: 1,
  completed: true,
  text: 'two'
}]);

const filter = Rx.Observable.of('SHOW_ALL');


const getTodos = Rx.Observable.combineLatest(todos, filter, (todos, filter) => {
  console.log('calculation');
  // doing some calculation...
  return todos;
});

getTodos.subscribe(console.log)
getTodos.subscribe(console.log)
<script src="https://unpkg.com/@reactivex/[email protected]/dist/global/Rx.js"></script>

Мне нужно, чтобы селектор результатов запускался только один раз для обоих абонентов, чтобы избежать перерасчета. Например, что-то вроде кэша, результат и дайте мне последнее значение, если ни один из входов не изменится.

Есть ли способ сделать это с помощью RxJS?

Теги:
rxjs

1 ответ

2
Лучший ответ

Я думаю, вы ищете оператора shareReplay. Это позволяет вам делиться стоимостью, производимой вашим combineLatest между всеми подписчиками. https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharereplay.md

Возможно, вам захочется взглянуть на replay если вы не хотите, чтобы автоматическое соединение/отсоединение, когда абонент переходил от 0 до 1 или более, и наоборот. https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/replay.md

const getTodos = Rx.Observable.combineLatest(todos, filter, (todos, filter) => {
  console.log('calculation');
  // doing some calculation...
  return todos;
})
.shareReplay();

Вот пример:

const todos = Rx.Observable.of([{
  id: 1,
  completed: false,
  text: 'one'
}, {
  id: 1,
  completed: true,
  text: 'two'
}]);

const filter = Rx.Observable.of('SHOW_ALL');

const getTodos = Rx.Observable.combineLatest(todos, filter, (todos, filter) => {
  console.log('calculation');
  // doing some calculation...
  return todos;
})
.shareReplay();

getTodos.subscribe(console.log.bind(console))
getTodos.subscribe(console.log.bind(console))
<script src="/rx.lite.js"></script>
  • 0
    Я получаю эту ошибку: Rx.Observable.combineLatest (...). ShareReplay не является функцией
  • 0
    shareReplay доступен с версии RxJS 5.4.0. Скорее всего, у вас более старая версия.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню