0

我想创建一个事件流,只要用户触摸并移动他的手指一些像素,它就会触发事件。事件应包含用户移动了多少的相对 x 和 y 值。以下代码正确执行此操作:

            var extractTouchEvent = function (type) {
                return extractEventE(document.body, type).mapE(function(e){
                    return {left:e.targetTouches[0].pageX, top:e.targetTouches[0].pageY};
                });
            };

            var touchStartE = extractTouchEvent('touchstart');
            var touchMoveE = extractTouchEvent('touchmove');

            var draggedE = switchE(touchStartE.mapE(function(startValue){
                return touchMoveE.mapE(function(moveValue){
                    return {left:moveValue.left-startValue.left, top:moveValue.top-startValue.top}
                })
            }));

但是如果我们通过添加一些日志来修改它:

    var draggedE = switchE(touchStartE.mapE(function(startValue){
                        return touchMoveE.mapE(function(moveValue){
                            var a = {left:moveValue.left-startValue.left, top:moveValue.top-    startValue.top};
console.log(a.left);
return a;
                        })
                    }));

我们将看到所有过去的 touchmove EventStreams 仍然对每个 touchmove 事件进行评估,尽管被 switchE 方法删除,它只为结果事件选择最新的 EventStream。这些是否有任何方法可以避免这种懒惰评估的巨大泄漏?

4

1 回答 1

0
var downE = clickDownE( guiElement ).mapE( function(){
return mouseMoveE( guiElement );
});
var upE = clickUpE( guiElement ).mapE( function(){
return zeroE();
};
var coordinatesE = mergeE(downE, upE).switchE();

这没有很好的记录,但如果你给 switchE 一个 zeroE 它将清理所有内容并停止。如果你给它其他事件,它会在每次评估时清理并输出新事件。

于 2013-11-06T11:15:30.110 回答