Each has very different strengths, and it's very easy to work with both together.
const someStream = Rx.fromPromise(myAsyncAwaitFunction())
const arrayINeed = await myRxObservable.toArray().toPromise()Vs
Observable.of(thing).subsribe((res)=>{call back}
For all(most) cases where you only need to hear back once
But again, it's a false dichotomy, and your second example isn't much different from what await essentially rewrites to:
Thing().then(val => /* call back */)
The benefit to async/await is that the runtime does the rewriting to Promise callbacks for you. But you can use both and get that advantage for both. Rx has supported converting to/from Promises since the beginning. Working with both is easy. let val = await observableOfJustOneThingINeed
.take(1) // I just need one, I don't care if there are more
.toPromise()
You don't have to manually subscribe, you can use a Promise and await it.For instance:
let jsonStream = searchFieldChanges // observable of search field change
.debounce(300 /* ms */) // don't do it too often
.flatMapPromise(async (search) => {
const request = await fetch(`${searchUrl}?query=${search}`)
return await request.json()
})
ETA: To reiterate the point: both tools are better together and it's not one or the other, it's like most tools finding the right one for the right job.I worked in the C# world for a while and I'm still in envy of how clear and powerful good async support is.
You can't avoid callbacks in an asynchronous flow. async/await is just a conversion between imperative looking code and a callback structure. It's a great win for developers that we've built such conversion tools (thanks to work on monads in languages like Haskell and OCaml).
Rx is for higher-order asynchronous streams where you have multiple events over time. It doesn't have the beauty of async/await because it's a much more complicated abstraction than the basic monad of Promise/Task. If you have a stream of events over time you can use Rx and if you have just one Promise at a time you can use Promise/Task and thus async/await. (The difference between I want to know every click of this button and I want to know just the next click of this button.) Most applications are a little bit of column A and a little bit of column B, and you don't have to pick one or the other, you can use both side-by-side.
I know some not bad js developers who use RX a lot and have no idea about `async/await` existence, I even had to explain to couple of them how `async/await` works and what is "imperative code". No joke.