I seem to be a little bit confused when comparing Clojure's core.async to the so called Reactive Extensions (Rx) and FRP in general. They seem to tackle similar problem of async-hronicity, so I wonder what are the principal differences and in what cases is one preferred over the other. Can someone please explain?
EDIT: To encourage more in-depth answers I want to make the question more specific:
Core.async allows me to write synchronous-looking code. However as I understand it FRP only needs one level of nested callbacks (all the function that handle logic are passed as arguments to FRP API). This seems that both approaches make the callback pyramids unnecessary. It is true that in JS I have to write
function() {...}
many times, but the main problem, the nested callbacks, is gone in FRP also. Do I get it right?"FRP complects the communication of messages with flow of control" Can you (someone) please give a more specific explanation?
Can't I pass around FRP's observable endpoints the same way as i pass channels?
In general I understand where both approaches historically come from and I have tried few tutorials in both of them. However I seem to be "paralyzed" by the non-obviousness of differences. Is there some example of a code that would be hard to write in one of these and easy using the other? And what is the architectural reason of that?