Я использую 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?
Я думаю, вы ищете оператора 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>
shareReplay
доступен с версии RxJS 5.4.0. Скорее всего, у вас более старая версия.