Я хочу сделать простую веб-страницу с помощью 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
?
Я думаю, вы хотите использовать 'flatMap' – Bergi
Вы правы Берги. Я понял это, когда я лежал в постели прошлой ночью. :) – chreekat