javascript - Rx.Observable.fromEvent(document, 'click') 对比。 document.addEventListener ('click',回调)

标签 javascript events rxjs reactive-programming

我刚开始学习响应式编程和使用 RxJS 库。

让我头晕目眩的一件事是,当 JavaScript 中有事件的概念时,我为什么要使用 Rx。

例如,Rx.Observable.fromEvent(document, 'click') 之间的差异是什么?和 document.addEventListener('click', callback) .两者都在处理 click异步事件。

那么在这种情况下我为什么要使用 observables 呢?

最佳答案

因为你可以很容易地修改,将 observables 与默认的事件监听器组合起来,你最终会陷入一种回调 hell 。

假设您想收听拖动事件(单击鼠标时的所有鼠标移动事件)

let mouseDown = false;
document.addEventListener('mousedown', (ev) => mouseDown = true);
document.addEventListener('mouseup', (ev) => mouseDown = false);
document.addEventListener('mousemove', (ev) => {
   if(mouseDown) {
      // do something with it
   }
}

您已经必须使用一些状态来管理它,但这还不错。所以现在扩展它以获得阻力的距离。
let mouseDown = false;
let startPoint;
document.addEventListener('mousedown', (ev) => { 
   mouseDown = true;
   startpoint = ev.clientX
});

document.addEventListener('mouseup', (ev) => mouseDown = false);
document.addEventListener('mousemove', (ev) => {
   if(mouseDown) {
      let distance = ev.clientX - startPoint;
      // do something with it
   }
}

所以另一个状态变量,你可以看到回调正在接管。这是一个非常简单的例子。
这是 rxjs - 方式
let down$ = fromEvent(document, 'mousedown')
let up$ = fromEvent(document, 'mouseup')
let move$ = fromEvent(document, 'mousemove')

let drag$ = down$.pipe(
  switchMap(start => move$.pipe(
                        map(move => move.clientX - start.clientX),
                        takeUntil(up$)
                     )
            )
  )

没有状态进化,所有部分都可以重复使用,看起来很容易。现在想象一下添加触摸支持。使用 rxjs,它只是将 touchevents 与它们各自的 mouseevents 合并,其他事情保持不变。对于普通事件,您可能会花费 30 行左右

关于javascript - Rx.Observable.fromEvent(document, 'click') 对比。 document.addEventListener ('click',回调),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48199697/

相关文章:

javascript - 如何更改 moment.js 的语言?

javascript - 为什么这个数组复制不能按预期工作?

angular - 在 Angular8 中检测多个 ajax 请求状态的最佳专业方法是什么?

angular - 在 Angular 2 中寻找 RxJs ofObjectChanges 方法的模拟

javascript - 宽度缩放时透视变换不缩放?

javascript - knockout 装订的 strip 元素

c# - 将事件处理方法设为静态是否存在任何陷阱?

javascript - 如何使用 javascript/jquery 检查鼠标是否退出浏览器窗口?

javascript - 语义 ui-react 复选框的更改处理程序不起作用 : React+Typescript

angularjs - 与 Angularjs 1.X 中的 $watch 相比,rxjs observable 的性能如何?