bacon.js와 FRP를 이해하려고 노력하면서 간단한 드래그 앤 드롭 예제를 만들려고 노력했지만 느린 평가에 문제가 있습니다. 한 조각의 코드. 스트림에 .log()
을 추가하면 모양이 좋아 보이지만 제대로 작동하는 것처럼 보입니다. 그러나 제거하면 업데이트되지 않습니다. 여기에 내가 뭘하는지입니다 :Bacon.js lazy evaluation, 마우스 드래그 예제가 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 * 함수에 의존 할 때, 그 lazy evaluation은 예기치 않은 행동을 일으키는 것에 동의합니다. Lukasz의 대답은 나에게 꽤 잘 보인다. 다음을 제외하고는 Wolfflow의 그림과 같이 flatMap을 사용했을 것입니다. http://codepen.io/wolfflow/pen/cudiJ Google 그룹스에 관련 스레드가 있습니다. https://groups.google.com/forum/ #! topic/baconjs/OR0C2jPCF9g – raimohanska
그리고 여기 flatMap을 가진 나의 바이올린 : http://jsfiddle.net/TFPge/ – raimohanska