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