2014-12-07 3 views
1

Я хочу сделать простую веб-страницу с помощью bacon.js. Он должен иметь кнопку, которая переключает логическое состояние щелчком мыши. После настройки потоков приложение должно быть инициализировано путем отправки объекта в поток инициализации. Здесь я просто отправлю желаемое начальное булево состояние переключателя (false). код выглядит следующим образом (я подделал щелчки кнопок и инициализации):Как использовать scan() более ясно

// Helper function 
var neg = function (a) { return !a; }; 

// Fake of initialization stream. End after one element 
var init = Bacon.sequentially(500, [false]); 
// Fake of button click event stream. 
var click = Bacon.repeatedly(1000, [{}]); 

var toggle = init.concat(click).scan(null, 
    function(a, b) { return a === null ? b : neg(a); }).skip(1).toEventStream(); 

toggle.log(); 
// Output: false, true, false, true, .... 

Код выше (jsFiddle) работает, как ожидалось, но мне не нравится, что создание линии toggle поток настолько сложен.

Если можно было бы опустить начальное значение (взять его из потока), и если scan возвращает EventStream вместо Property, я мог бы написать:

var toggle = init.concat(click).scan(neg); 

Это можно прочитать гораздо лучше. Или, если можно было бы дать семя как поток я мог бы просто написать:

var toggle = click.scan(init, neg); 

Есть ли у вас какие-либо предложения, чтобы сделать код более понятным? Есть ли альтернативное решение для использования scan? Должен ли я сделать мне собственный метод scan?

ответ

1

Если вы читаете то, что я написал ранее, игнорируйте. Это. :) Эта ситуация именно для flatMap: для потоков, создающих потоки. Используйте flatMap.

// Helper function 
var neg = function (a) { return !a; }; 

// Fake of initialization stream. End after one element 
// Note the use of `later` instead of `sequentially`, by the way 
var init = Bacon.later(500, false); 

// Fake of button click event stream. 
var click = Bacon.repeatedly(1000, [null]); 

var toggle = init 
    .flatMap(function(initVal) { return click.scan(initVal, neg) }); 

toggle.log(); 
+0

Я думаю, вы хотите использовать 'flatMap' – Bergi

+0

Вы правы Берги. Я понял это, когда я лежал в постели прошлой ночью. :) – chreekat

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

  • Нет связанных вопросов^_^