Зависит от того, что вы пытаетесь сделать, но примерно это должно выглядеть примерно так ...
const filtered = data.pipe(switchMap(data => {
return value.pipe(startWith(''), combineLatest(clicks.pipe(startWith(null))), map(([value, _]) => {
return data.filter(item => item.includes(value));
}));
}));
Вот Гист, с которым вы можете играть: https://gist.github.com/westonpace/4f7811b6735c94e97928be1bb6a377ce
Iисключил format
и упростил filter
для краткости, но этого можно добиться, бросив map
на value
между startWith
и combineLatest
.Это будет вести себя не так, как ваш код, с некоторыми незначительными способами, которые вы можете настроить, если хотите.
В вашем примере, если initialData
холодный и требует времени для запуска и clickSource
и valueSource
раньше, чем вы могли бы получить пустой массив.В моем примере вы не получите никаких результатов, пока initialData
не сработает хотя бы один раз.Вы можете использовать startWith
на data
до switchMap
, если вы хотите такое поведение.
Кроме того, в вашем примере, если initalData
сработал во второй раз, ничего не произойдет (наблюдаемая будет продолжать фильтровать старое исходное значение), где в этом примере, если initialData
сработает снова, он переключитсяперейти к фильтрации нового массива, но, вероятно, потеряет значение из valueSource
.
В вашем примере вы не получите никаких результатов для начала, и тогда будет получен первый результат, если clickSource
или valueSource
Пожар.Я не мог придумать способ воспроизвести это точно на макушке.Мой код сработает сразу же, как только data
сработает.Если вы отключите startWith
на clicks
, то оно сработает только при срабатывании clickSource
.Если вы выключите startWith
на value
, он сработает только тогда, когда valueSource
сработает хотя бы один раз.Если вам действительно нужно это поведение, вы можете начать вместо data.filter
с merge(clicks, value).pipe(switchMap(_ => data.filter...