Возможно, имея молоток Bacon.js в руке, все начинает выглядеть как гвоздь. Но это похоже на проблему, которая может быть изящно решена с ней, и у меня недостаточно опыта, чтобы понять это.Наличие разных потоков Bacon.js вычисляет их значения в одном и том же прерывистом окне
Многие места в моем приложении должны иметь свои собственные Bacon.EventStream
. Вычисление значения этих различных потоков требует дорогостоящей установки и разбивки:
var stream1 = Bacon.fromPoll(100, function() {
setup(); // expensive
var result = compute1(); // cheap
breakdown(); // expensive
return new Bacon.Next(result);
});
// similar for stream2, stream3, etc.
Но установка и пробой является одинаковой для всех таких потоков. Таким образом, это имеет смысл для группы, поскольку многие из этих вычислений вместе, как это возможно:
Bacon.interval(100, function() {
setup();
// compute value for property1
// compute value for property2
// compute value for property3
// ...
breakdown();
});
Но все эти независимые потоки будут созданы в разных местах в коде, и могут иметь различные скорости опроса и тому подобные. Каждый из них должен подождать следующего доступного окна , чтобы вычислить их значение. Этот шаг будет установлен некоторым глобальным потоком, обеспечивающим это окно.
- Вычисление никогда не должно выполняться за пределами окна.
- Как можно больше вычислений можно сгруппировать в одном окне.
- Предпочтительно, чтобы установки и пробоя не возникали, если нет вычислений для выполнения.
Я играл, и JSFiddle here - лучшее, что я придумал до сих пор. Но (1) Неточная информация; .skipWhile(property)
, кажется, только пропустить один раз, и (2) код уже выглядит слишком сложен. Вы можете сделать лучше?
Edit: Я обновил JSFiddle. Сейчас он работает правильно. Но мне интересно, пользуюсь ли я лучшими практиками. Можно ли упростить этот код?
Привет Ollim, хорошо выглядеть ! Как вы говорите, более элегантный, чем мой, потому что другие потоки теперь могут использовать это без шаблона. Я согласен с тем, что общее решение должно иметь возможность делать буферизацию, но мне нужно решение без буферизации (в качестве опции), вместо этого использующее последнее значение для каждого окна. Мне удается это сделать, используя «манекен' сокращение », который возвращает последнее значение. Вы знаете лучшее решение? – mhelvens
Я добавил решение без буферизации, 'toProperty()' хранит последнее значение и 'eventStream.map (свойство) 'возвращает значение этого свойства, когда поток получает значение. – OlliM
Отлично! Спасибо за это! – mhelvens