如何处理未使用的flapjax EventStreams

时间:2013-10-22 09:26:48

标签: javascript frp

我想创建一个事件流,只要用户触摸并将手指移动一些像素,就会触发事件。事件应包含用户移动了多少的相对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。 这些方法是否可以避免这种懒惰评估的大量泄漏?

1 个答案:

答案 0 :(得分: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一个零,它会清理所有东西并停止。如果你给它其他事件,它将清理并输出每个evaulation的新事件。