Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么tap操作员会影响水流?_Javascript_Rxjs_Rxjs6 - Fatal编程技术网

Javascript 为什么tap操作员会影响水流?

Javascript 为什么tap操作员会影响水流?,javascript,rxjs,rxjs6,Javascript,Rxjs,Rxjs6,出于某种原因,使用tap操作符会改变流的输出(实际上提供了我预期的结果)。当我移除抽头时,后续过滤器似乎不再工作 我已经在codesandbox上用 tap(([prevMouseEvent, currentMouseEvent]) => console.log(directionChange(prevMouseEvent, currentMouseEvent)) ), 包括以及注释掉。如果没有点击,后续的过滤器似乎不起作用,我会得到一个恒定的成对鼠标事件流 // Ret

出于某种原因,使用tap操作符会改变流的输出(实际上提供了我预期的结果)。当我移除抽头时,后续过滤器似乎不再工作

我已经在codesandbox上用

  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,它就可以工作了,但是有人能解释为什么这里需要tap操作员来获得所需的输出吗?我认为tap操作符返回了一个相同的observable,因此对它所在的流的输出没有影响。

谢谢您的建议。雅各布-你的建议让我去在它自己的独立项目中重新创建它。。。而且效果很好。所以我关闭了所有的东西,重新打开了原来的项目,然后我发现它成功了。我真的不知道为什么它以前不工作(尽管整版刷新以刷新任何剩余的事件处理程序),但我真正需要的就是古老的“你是否尝试重新启动过你的计算机”。谢谢你的想法

谢谢你的建议。雅各布-你的建议让我去在它自己的独立项目中重新创建它。。。而且效果很好。所以我关闭了所有的东西,重新打开了原来的项目,然后我发现它成功了。我真的不知道为什么它以前不工作(尽管整版刷新以刷新任何剩余的事件处理程序),但我真正需要的就是古老的“你是否尝试重新启动过你的计算机”。谢谢你的想法

这是一个普通的JavaScript环境吗?这似乎很奇怪;我唯一的猜测是,可能事件对象正在被重用,就像React使用事件池一样。另外,如果您在代码沙盒中运行此功能,您可以发布链接吗?我真的看不出你的代码有任何问题。也许日志语句只是让事情变得足够慢,以至于移动事件变得更加戏剧性?例如,如果你向上和向左移动,并且事件循环非常快,你可能会得到“上一个”然后“左一个”作为单独的事件,这会触发这个。这是一个普通的JavaScript环境吗?这似乎很奇怪;我唯一的猜测是,可能事件对象正在被重用,就像React使用事件池一样。另外,如果您在代码沙盒中运行此功能,您可以发布链接吗?我真的看不出你的代码有任何问题。也许日志语句只是让事情变得足够慢,以至于移动事件变得更加戏剧性?例如,如果你向上和向左移动,并且事件循环非常快,你可能会得到“上一个”然后“左一个”作为单独的事件,这将触发此事件。