Я пытаюсь понять bacon.js и FRP, поэтому попытался сделать простой пример перетаскивания, но у меня возникли проблемы с ленивой оценкой одного фрагмента кода. Когда я добавляю в поток .log()
, кажется, что он выглядит и действует нормально, но если я его вынимаю, он не обновляется. Вот что я делаю:Bacon.js ленивая оценка, пример перетаскивания мышью ломается без оператора log()
// UI streams
block_mousedown = block_el.asEventStream('mousedown').map(xyFromEvent);
global_mousemove = html.asEventStream('mousemove').map(xyFromEvent);
global_mouseup = html.asEventStream('mouseup');
// Composites
isDragging = block_mousedown.merge(global_mouseup.map(0));
mouseDragging = Bacon.combineAsArray(isDragging, global_mousemove)
.filter(function(v){ return notZero(v[0]) })
mouseDeltaFromClick = mouseDragging
.map(getDelta)
// Block offset when it was clicked on
block_pos_at_mousedown = block_mousedown
.map(function(a,b){ return block_el.offset();})
.map(function(e){ return [e.left, e.top]; })
// If I remove this log(), it doesn't evaluate
.log();
// merge mouse delta with block position when clicked
mouseDeltaAndBlockPos = mouseDeltaFromClick
.combine(block_pos_at_mousedown, '.concat')
.onValue(function(e){
block_el.css({
top : e[3]+e[1]+"px",
left : e[2]+e[0]+"px"
});
});
А вот jsFiddle of it
Я думаю, что я мог бы идти о все это неправильно, это даже правильный подход? Я хочу пройти через позицию блока, когда он был нажат, который должен обновиться на mousedown
, но не обновляться вместе с mousemove
.
ленив оценки и порядок оценки идут рука об руку. .. –
Я согласен, что эта ленивая оценка вызывает неожиданное поведение, если ваш код полагается на функцию * map *, вызываемую в определенное время. Ответ Лукаша все еще выглядит довольно хорошо для меня. За исключением того, что я использовал flatMap, как в примере рисования Wolfflow: http://codepen.io/wolfflow/pen/cudiJ В Google Groups также есть связанный поток: https://groups.google.com/forum/ #! topic/baconjs/OR0C2jPCF9g – raimohanska
И вот моя скрипка с flatMap: http://jsfiddle.net/TFPge/ – raimohanska