Что у меня есть: Сервис, в сервисе предмет и наблюдаемое, созданное на основе этого предмета. Я испускаю, например, 3 раза, используя «subject.next» из 3 отдельных компонентов и подписываюсь в другом компоненте.
Чего я хочу добиться? В моей подписке фильтр по свойству: получить только два первых выданных значения, получить значение с максимальным значением в свойстве, автоматически отказаться от подписки.
Что я пробовал:
const validValues = ['a','b']
this.myService.pipe(
filter(x => validValues.some(y => y === x.name)),
max((a,b) => a.value - b.value),
take(2)
)
Take (2) не работает, по-прежнему получаются 3 значения. Какие-либо предложения ?
Порядок оператора имеет значение. Попробуйте переместить take(2)
перед оператором max()
. — person Mr.FloppyDisk schedule 02.03.2021
Оператор max работает после завершения наблюдаемого источника. И поскольку наблюдаемый объект, инкапсулированный в subject, не завершится по умолчанию, упомянутый вами фрагмент никогда не будет сгенерирован, если вы не вызовете subject.complete (). Я предполагаю, что предметом является this.myService.
Сказав это, то, чего вы хотите достичь, можно сделать, поместив оператор take по крайней мере перед оператором max. Take отменит подписку после 2 выбросов, завершив источник, наблюдаемый для оператора max.
Теперь, в зависимости от того, хотите ли вы получить 2 выброса после / до фильтрации, вы можете разместить take () после / до filter ().