Я думаю, что основная проблема заключается в том, что ваше предположение о решаемой проблеме не совсем так, поскольку ни один из них не решает «проблему» асинхронности.
Абстракции
FRP
основная идея заключается в распространении изменений, подумайте о том, чтобы выполнить то же самое, что делает Excel, где вы определяете ячейки, зависящие друг от друга в каскаде, и когда одна ячейка изменяется, все зависимые ячейки в каскаде пересчитано.
core.async
основная идея заключается в декомпозиции систем, представьте, что задачи разделяются с помощью queue
в середине разных процессов, в core.async
случае вместо очередей у вас есть каналы, но вы поняли идею.
Таким образом, удаление пирамидального кода не является целью ни одной из технологий, и они работают на разных уровнях абстракции.
О завершении потока управления
Идея завершения коммуникации и управления потоком взята из оригинала. основной асинхронный пост.
Хотя существуют различные механизмы для очистки событий/обратных вызовов (FRP, Rx/Observables), они не меняют своей фундаментальной природы, заключающейся в том, что при событии запускается произвольное количество другого кода, возможно, в том же потоке, что приводит к предостережения, такие как «не делайте слишком много работы в своем обработчике», и такие фразы, как «ад обратных вызовов».
Перефразируя, если у вас есть код бизнес-домена внутри обработчика событий, вы завершили обработку события X с помощью что делать, когда происходит X.
Это то, что решает core.async
, поскольку введение очереди/канала посередине помогает лучше разделить задачи.
Реализация
Все ваши вопросы, касающиеся обратных вызовов и передачи наблюдаемых конечных точек в качестве параметров, являются просто вопросами реализации, это действительно зависит от реализации Rx
и API.
Если вы посмотрите на повторно используемые компоненты React, у вас действительно не так много ад обратного вызова, который нужно увидеть, и вы получаете представление о передаче наблюдаемых.
Последние мысли
Даже если Rx
можно использовать для моделирования любого потока данных, он чаще используется для рендеринга пользовательского интерфейса в стиле Excel, чтобы упростить обновление представления при изменении модели.
С другой стороны, Core.Async
можно использовать для моделирования разделения проблем, когда любые две подсистемы взаимодействуют друг с другом (тот же сценарий использования, что и очереди), используя его в цепочке рендеринга пользовательского интерфейса, основная идея заключается в разделении:
- Генерация и обработка событий на стороне сервера
- Как это событие влияет на вашу модель
Таким образом, вы можете иметь core.async
и FRP
вместе, поскольку core.async
будет разделять задачи, а FRP
будет определять ваш каскадный поток данных после обновления вашей модели.
person
guilespi
schedule
26.12.2013