Это на самом деле работает правильно. Путаница возникает из-за оператора partition
, который в основном состоит из двух filter
операторов .
Если переписать его без partition
, оно будет выглядеть так:
const fire$ = from([true]).pipe(
share(),
filter(() => hasAmmo),
);
const noAmmo$ = from([true]).pipe(
share(),
filter(() => !hasAmmo),
);
Имейте в виду, что изменение hasAmmo
не влияет на саму partition
. partition
действует только тогда, когда он получает значение от своего источника Observable.
При последующем использовании merge()
он делает две отдельные подписки на две совершенно разные цепочки с двумя разными from([true])
с. Это означает, что true
передается как fire$
, так и noAmmo$
.
Так что share()
здесь никак не влияет. Если вы хотите поделиться им, вам придется обернуть from
, прежде чем использовать его на fire$
и noAmmo$
. Если наблюдаемый источник просто from
, он, к сожалению, будет еще более запутанным, поскольку первоначальное излучение поступит только первому подписчику, который на fire$
позже при использовании в merge
:
const shared$ = from([true]).pipe(
share(),
);
const fire$ = shared$.pipe(...);
const noAmmo$ = shared$.pipe(...);
Последнее, почему вы получаете оба сообщения, это то, что partition
не изменяет значение, которое проходит. Он только решает, какой из возвращаемых Обсерваторий переиздаст его.
Кстати, лучше избегать partition
полностью, потому что это, вероятно, устареет, и просто используйте filter
, что более очевидно: