因为您可以轻松地修改,将 observables 与默认事件侦听器组合在一起,最终会陷入回调地狱。
假设您想监听拖动事件(所有鼠标移动事件,同时单击鼠标)
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 行左右