По какой-то причине наличие оператора отвода изменяет вывод потока (фактически обеспечивая мой ожидаемый результат). Когда я удаляю кран, последующий фильтр больше не работает.
Я запустил приведенный ниже код на codeandbox с включенным
tap(([prevMouseEvent, currentMouseEvent]) =>
console.log(directionChange(prevMouseEvent, currentMouseEvent))
),
и закомментированным. Без касания последующий фильтр, по-видимому, не работает, и я получаю постоянный поток парных событий мыши.
// Returns true if the predominant movement in the mouse has changed direction
const directionChange = (prevMouseEvent, currentMouseEvent) => {
const dominantAxisMovement =
Math.abs(currentMouseEvent.movementX) >
Math.abs(currentMouseEvent.movementY) ? "X" : "Y";
if (dominantAxisMovement === "X") {
return (
Math.sign(currentMouseEvent.movementX) !==
Math.sign(prevMouseEvent.movementX)
);
} else {
return (
Math.sign(currentMouseEvent.movementY) !==
Math.sign(prevMouseEvent.movementY)
);
}
};
const mouseDirectionSwitch$ = fromEvent(document, "mousemove").pipe(
pairwise(),
tap(([prevMouseEvent, currentMouseEvent]) =>
console.log(directionChange(prevMouseEvent, currentMouseEvent))
),
filter(([prevMouseEvent, currentMouseEvent]) =>
directionChange(prevMouseEvent, currentMouseEvent)
)
);
mouseDirectionSwitch$.subscribe(passed => console.log(passed));
То, чего я пытаюсь достичь, - это наблюдаемое, которое излучается только тогда, когда пользователь меняет направлениедвижения мыши (и под изменением движения я имею в виду вверх вниз и слева направо, а не тонкие изменения). С помощью крана это работает, но кто-нибудь может объяснить, почему оператор крана требуется здесь, чтобы получить желаемый результат? Я думал, что оператор tap вернул идентичный наблюдаемый объект и поэтому не будет влиять на вывод потока, в котором он находится.