如何对baconJS中的takeUntil流做出反应

时间:2014-10-16 07:59:35

标签: javascript frp bacon.js

我有3个用于mouseDown,mouseUp和mouseMove的事件流。到目前为止,当用户没有点击alt键时,它会在鼠标移动时执行某些操作,直到鼠标移动为止。

this.mouseDown
   .filter((e) =>!e.altKey)
   .flatMap(() => this.mouseMove.takeUntil(this.mouseUp))
   .onValue((e) => this.setState({previewEndPoint: this.getNearestPoint(e)}));

我的问题是在这种情况下如何对鼠标注册事件作出反应?

2 个答案:

答案 0 :(得分:2)

doAction中设置变量并在其他地方使用它是非常糟糕的迹象,也是不必要的。我重构了你的代码以使用组合流。

var moveStart = this.mousedown
  .filter((e) =>!e.altKey && !e.metaKey)    

var move = moveStart.flatMap((e) =>
    this.mousemove
        .takeUntil(this.mouseup)
        .startWith(this.getNearestPoint(e))
  );

var startPoint = moveStart.map((e) => this.getNearestPoint(e))

var endPoint = move.map((e) => this.getNearestPoint(e))

var preview = startPoint.combine(endPoint, (start, end) => {
    preview: true,
    startPoint: start,
    previewEndPoint: end
})

preview.onValue((state) => this.setState(state));

move.onEnd(this.endLine.bind(this));

答案 1 :(得分:1)

我必须创建一个通过鼠标向下启动并转换为鼠标移动的流 使用flatMap的事件,然后在鼠标上停止。然后,我只需听取onValueonEnd

var move = this.mousedown
  .filter((e) =>!e.altKey && !e.metaKey)
  .doAction((e) => startPoint = this.getNearestPoint(e))
  .flatMap(() => this.mousemove.takeUntil(this.mouseup));

move.onValue((e) => this.setState({
  preview: true,
  startPoint: startPoint,
  previewEndPoint: this.getNearestPoint(e)
}));

move.onEnd(this.endLine.bind);