Класс SourceRace

SourceRace на GitHub

Это источник данных предназначенный для получения данных только от первого ответившего источника.

Это поведение может быть очень полезным, чтобы избавиться от условий в приложении. Благодаря классу SourceRace каждый источник данных может сам решить должен ли он вообще отдавать какую-либо информацию или можно промолчать.

Для примера сделаем программу, которая будет умножать на 2 четные числа и на 3 нечетные

Пример 1.

import {
  SourceMap,
  SourceRace,
  Source,
  SourceWithPool,
  give,
  value,
  GuestCast,
  Private,
} from "patron-oop";

const isEven = (v) => v % 2 === 0;
const isOdd = (v) => v % 2 !== 0;

const nTimesSource = (condition, n, baseSource) => (guest) => {
  value(
    baseSource,
    new GuestCast(guest, (value) => {
      if (condition(value)) {
        give(value * n, guest);
      }
    })
  );
};

const source = new SourceWithPool([1, 2, 3, 4, 5]);
const guestMapped = new SourceMap(
  source,
  new Private(
    (itemSource) =>
      new SourceRace([
        nTimesSource(isEven, 2, itemSource),
        nTimesSource(isOdd, 3, itemSource),
      ])
  )
);

guestMapped.value((v) => {
  document.querySelector(".guest-result").textContent = v.join();
});

Результат 1.

Результат = 0

В программе использованы классы и функции:

 

Можно сказать, что код примера слишком сложный для такой простой задачи. Да это правда, но пример показывает, что можно построить код таким образом, чтобы классы или функции сами в зависимости от значения решали должны ли они выполнять свою работу или нет

Эта возможность - принимать решение давать свой ответ или нет внутри объектов - может быть очень ценной для инкапсуляции логики и переиспользования