Большинство ресурсов для реактивного программирования, например. «Обзор по реактивному программированию» (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
В частности, я ничего не знаю о bacon.js, но когда я ввел в действие и толкающий и вытянутый рисунок в ванили, ваш код, похоже, совпадает с подходом: http://jsfiddle.net/nf331L5n/ – dandavis
Я думаю, вы скорее ищете раздел https://github.com/baconjs/bacon.js/#atomic-updates – Bergi
@Bergi Собственно, это не имеет особого отношения к моему вопросу. Однако это тоже очень интересно! Спасибо! – lambdarookie