Для того, чтобы фильтровать поток A с использованием значений потока B, вы должны наблюдать поток B и использовать последние значения для фильтрации потока А.
Использование switch()
чтобы преобразовать B, наблюдаемые к наблюдаемым значениям образования от наблюдаемого A.
checkedInputValuesSource
.map(function (options) {
return dataSource
.filter(function (value) {
return options.indexOf(value) !== -1;
});
})
.switch()
.subscribe(function (x) {
console.log('out: ' + x);
});
Использование switch()
предполагает, что dataSource
является hot observable.
Пример использования interval()
для получения фиктивных данных:
var input,
checkedInputValuesSource,
dataSource;
input = document.querySelectorAll('input');
// Generate source describing the current filter.
checkedInputValuesSource = Rx.Observable
.fromEvent(input, 'change')
.map(function() {
var inputs = document.querySelectorAll('input'),
checkedInputValues = [];
[].forEach.call(inputs, function (e) {
if (e.checked) {
checkedInputValues.push(e.value);
}
});
return checkedInputValues;
})
.startWith([]);
// Generate random data source (hot).
dataSource = Rx.Observable
.interval(500)
.map(function() {
var options = ['a', 'b', 'c'];
return options[Math.floor(Math.floor(Math.random() * options.length))];
})
.do(function (x) {
console.log('in: ' + x);
})
.share();
checkedInputValuesSource
.map(function (options) {
return dataSource
.filter(function (value) {
return options.indexOf(value) !== -1;
});
})
.switch()
.subscribe(function (x) {
console.log('out: ' + x);
});
<script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'></script>
<input type='checkbox' value='a'>
<input type='checkbox' value='b'>
<input type='checkbox' value='c'>
В этом примере будет производить вывод, подобный:
in: c
in: a
out: a
in: b
in: c
out: a
in: b
in: a
Где in
отражает все генерируемые входные и b
Данные, который пропускает фильтр. Фильтр настраивается путем проверки входов флажков, которые отражают значения «a», «b» и «c».
@ IonuţG.Stan Действительно. И это удивительно, сколько людей по-прежнему относятся к этим старым вопросам, поэтому, надеюсь, это поможет нескольким людям :) – Dorus
Вы должны заметить, что это аннотируется с помощью @Experimental и может в любой момент изменить ** значительно **, поэтому он не должен использоваться или использоваться в производственном коде. – acrespo
@acrespo Это используется в производственном коде во многих местах. Где именно вы нашли этот экспериментальный тег? – Dorus