Reactive programming uses observable streams to provide an API for asynchronous programming. Observables represent lazy push-based collections of multiple values over time. They address issues with callbacks such as callback hell and lack of error handling. Observables are cold (replayed on subscribe) or hot (shared between subscribers). Common methods include just(), of(), fromArray(), fromPromise(), fromEvent(), and fromCallback() to create observables from different sources. Operators like map(), flatMap(), and switchMap() transform streams, while retryWhen() and retry() handle errors.