2014-11-26 5 views
4

Большинство ресурсов для реактивного программирования, например. «Обзор по реактивному программированию» (Bainomugisha et al., 2012), вводят несколько характеристик, с помощью которых можно классифицировать различные реактивные решения. Одной из них является модель оценки, то есть, является ли реактивный язык (или библиотека) основанным на push или pull-based (или и тем и другим).Что такое оценочная модель Bacon.js?

Пример: Давайте взглянем на эту часть псевдокоде: var c = a + b; В реактивной среде, c, как ожидается, всегда содержат сумму a и b. Соответственно, если a или b меняются, стоимость c должна быть пересчитана. В push-based решении a и b сообщают c, когда их значения изменились, так что значение c можно пересчитать мгновенно. В решении, основанном на тяге, c просматривает текущие значения a и b, как только требуется значение c. Таким образом, все пересчеты откладываются до тех пор, пока не будет запрошено значение c.

В течение довольно длительного времени я попытался выяснить, какая модель оценки используется библиотекой JavaScript Bacon.js. Давайте предположим следующее:

var a = Bacon.constant(21); // Creates a Property 
var b = Bacon.constant(21); 
var c = a.combine(b, function (x, y) { 
    return x + y; 
}); 

Согласно this section of the Bacon.js documentation, комбинаторы, такие как combine использования ленивых вычислений, то есть они «избежать оценки значений, которые на самом деле не нужны».

  • Вопрос 1: Когда нужны значения «на самом деле»?
  • Вопрос 2: Можно ли предположить, что - по крайней мере, в случае примера выше - Bacon.js использует подход с натягом? Или я смешиваю вещи здесь?

Однако ближе к концу раздела, документация Bacon.js упоминает, что если кто-то хочет «[т] о силе оценки на момент первоначального события, [один] может просто использовать flatMap». Действительно, теперь я смущен:

  • Вопрос 3: Соответственно, безопасно предположить, что Bacon.js использует пуш на основе модели оценки всякий раз, когда я использую flatMap? Или я смешиваю вещи здесь - снова?
  • Вопрос 4: Я не могу воспроизвести пример сверху, используя flatMap вместо combine. Означает ли это, что, в зависимости от того, что я пытаюсь сделать, Bacon.js иногда использует растягивающееся распространение изменений, а иногда и на основе push-based?

Для того, кто может дать разъяснения, я был бы очень благодарен. : P

+1

В частности, я ничего не знаю о bacon.js, но когда я ввел в действие и толкающий и вытянутый рисунок в ванили, ваш код, похоже, совпадает с подходом: http://jsfiddle.net/nf331L5n/ – dandavis

+1

Я думаю, вы скорее ищете раздел https://github.com/baconjs/bacon.js/#atomic-updates – Bergi

+0

@Bergi Собственно, это не имеет особого отношения к моему вопросу. Однако это тоже очень интересно! Спасибо! – lambdarookie

ответ

4
  1. Значение «необходимо», когда абонент вызывает value() метод события. Это происходит, например, во всех .on Value абонентах. Комбинаторы, такие как map и combine, не оценивают входные значения до тех пор, пока их соответствующее значение не потребуется. С другой стороны, flatMap(f) необходимо оценить, поскольку он использует значение для создания нового потока с использованием предоставленной функции f. Также scan в настоящее время нетерпелив.

  2. Как описано выше, это смесь толкания и тяги в том смысле, что оценка происходит, когда это необходимо. Фактически, Bacon.js не основан на каких-либо научных статьях и не соответствует каким-либо теоретическим моделям.

  3. Нет, не допускайте никаких моделей. Вместо этого используйте ссылочно прозрачные функции и дайте системе решить, когда нужно их оценивать.

  4. Наверняка вы не можете воспроизвести эту же функциональность с flatMap, что вы можете с combine.

+0

Я предполагаю, что OP означает воспроизведение 'c = объединение (a, b, +)' ​​с 'c = a.flatMap (a) -> b.map (b) -> a + b' – Bergi

+0

Точно. Фактически, поскольку я не смог воспроизвести свой пример с нетерпеливыми операторами, я подумал, в зависимости от того, что я пытаюсь сделать, Bacon.js дает мне либо нетерпеливую, либо ленивую оценку. Это правда? Или у всех есть легкий путь, а также ленивый путь ко всему? – lambdarookie

+0

http://baconjs.blogspot.com/2014/11/beware-of-lazy-evaluation.html –