2014-04-17 6 views
3

Я слежу за this snake example и решил изменить его, чтобы генерировать новые яблоки только в пустых (то есть не змеиных) ячейках. Тем не менее, который ввел циклическую зависимость между наблюдаемыми характеристиками, так как генерировать новые яблоки теперь зависит не только от последней позиции, но и на всей змеи:Нарушение цикла в змее FRP в Bacon.js

// stream of last `length` positions -- snake cells 
var currentSnake = currentPosition.slidingWindowBy(length); 

// stream of apple positions 
var apples = appleStream(currentSnake); 

// length of snake 
var length = apples.scan(1, function(l) { return l + 1; }); 

Есть хороший способ решить цикл?

Я могу представить, как это будет работать в грязной машине состояний, но не с чистой FRP.

Ближайший я могу вспомнить, сливающихся apples и length в один поток и сделать этот поток генерировать свой собственный "currentSnake" из currentPosition.

applesAndLength --> currentPosition 
     ^  ^
     |  /
     currentSnake 

Я не очень много думал о реализации.

ответ

4

После того, как он был построен, Бэкон обычно может обрабатывать циклическую зависимость между Observable с. Это их немного сложнее.

На языке, таком как Javascript, для создания структуры с циклом в ней (т. Е. Дважды связанного списка), вам нужна изменяемая переменная. Для обычных объектов вы используете для этого регулярную переменную или поле, например.

var tail = { prev: null, next: null }; 
var head = { prev: null, next: tail }; 
tail.prev = head; // mutating 'tail' here! 

В Бэкона, мы работаем по наблюдаемым вместо переменных и объектов, так что нам нужно какое-то изменяемый наблюдаемым для достижения тех же целей. К счастью, Bacon.Bus только вид наблюдаемой нам нужно:

var apples = new Bacon.Bus(); // plugged in later 
var length = apples.scan(1, function(l) { return l + 1; }); 
var currentSnake = currentPosition.slidingWindowBy(length); 
apples.plug(appleStream(currentSnake)); // mutating 'apples' here! 

По моему опыту, это preferrable сократить циклы на EventStream с вместо Properties, так как начальные значения, как правило, теряются в противном случае; таким образом, переупорядочение apples и length.

Смежные вопросы