Почему оператор отвода влияет на поток? - PullRequest
1 голос
/ 09 ноября 2019

По какой-то причине наличие оператора отвода изменяет вывод потока (фактически обеспечивая мой ожидаемый результат). Когда я удаляю кран, последующий фильтр больше не работает.

Я запустил приведенный ниже код на 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 вернул идентичный наблюдаемый объект и поэтому не будет влиять на вывод потока, в котором он находится.

1 Ответ

0 голосов
/ 09 ноября 2019

Спасибо за предложения. Джейкоб - твое предложение заставило меня пойти и воссоздать это в своем собственном независимом проекте ... и оно работало нормально. Так что я закрыл все и снова открыл первоначальный проект, и вот, он сработал. Я действительно не уверен, почему это не работало раньше (несмотря на полное обновление страницы, чтобы сбросить все оставшиеся обработчики событий), но старое «пытался ли ты перезагрузить компьютер» было всем, что мне действительно нужно. Спасибо за ваши идеи!

...