我想了解bacon.js和FRP,所以試圖做一個簡單的拖放示例,但我遇到了懶惰評估的一段代碼。當我在視頻流中添加.log()
時,它看起來很好看,但如果我將它取出,它不會更新。下面是我在做什麼:Bacon.js懶惰的評價,鼠標拖動示例中斷沒有日誌()語句
// 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