Reactive programming is programming with asynchronous data streams.
In Reactive you are able to create data streams of anything, not just from click and hover events.
A stream is a sequence of ongoing events ordered in time. It can emit three different things: a value (of some type), an error, or a "completed" signal.
We capture these emitted events only asynchronously, by defining a function that will execute when a value is emitted, another function when an error is emitted, and another function when 'completed' is emitted.
A stream can be used as an input to another one. Even multiple streams can be used as inputs to another stream.
Reactive Programming raises the level of abstraction of your code so you can focus on the interdependence of events that define the business logic, rather than having to constantly fiddle with a large amount of implementation details.
A Promise is simply an Observable with one single emitted value. Rx streams go beyond promises by allowing many returned values.
A metastream is a stream where each emitted value is yet another stream.