Динамическое изменение маршрута и циклическая зависимость с Mostjs
Очевидно, что xstream, с двумя методами addListener
а также removeListener
, может динамически перенаправлять потоки (изменять их источники и приемники). Я не вижу аналога с Mostjs. Позволяет ли вам только один раз выложить маршрутизацию потоков? Если да, то является ли это статичным характером, который позволяет большинству оптимизировать работу для достижения такой превосходной производительности?
Кроме того, xstream использует imitate
метод, который позволяет ему иметь круговые зависимости. Есть ли способ достичь круговой зависимости с Mostjs?
2 ответа
В большинстве.js есть много функций, которые работают как на Source
и Sink
например, map()
, который преобразует все события в потоке, действует как Sink
потребляя события, и как Source
при создании новых значений событий после применения к ним функций. observe()
пример конкретного вида Sink
который потребляет события и передает их функции, которую вы предоставляете.
Most.js Streams
не активны, пока вы не используете их, используя один из "терминальных" комбинаторов, observe
, drain
, или же reduce
, Когда вы звоните один из них, Stream
посылает сигнал в Source-Sink
цепь к Source
в самом начале цепочки. Этот производитель Source
затем начнет производить события.
События затем распространяются синхронно от Source
сквозь Source-Sink
цепочка простым вызовом метода.
Таким образом, вы можете предоставить свою собственную функцию "слушателя" map
что бы преобразовать события.
Есть много факторов, влияющих на производительность большинства.
Простая архитектура распространения событий в стеке вызовов плюс подъем
try/catch
реализации комбинатора были двумя самыми ранними и самыми большими улучшениями производительности.Most.js выполняет несколько других оптимизаций автоматически, основываясь на алгебраических эквивалентностях. Относительно известный пример - объединение нескольких
map
операции, напримерmap(g, map(f, stream))
в одинmap
делая функцию композиции наf
а такжеg
,Операция также объединяет несколько
filter
операции, несколькоmerge
операции, несколькоtake
а такжеskip
среди других. Эти оптимизации сокращают количество вызовов методов, необходимых для распространения события от производителя к потребителю.
Смотрите это интервью с Брайаном Кавалером
Сам Most.js не обрабатывает циклические зависимости, но это вполне возможно, используя most-proxy
, Мотоцикл делает это, чтобы создать свой цикл в его run
пакет.
Вы видели этот вопрос относительно xstream.js
imitate
в most.js
? https://github.com/cujojs/most/issues/308