Open
Description
Discussed in #6779
Originally posted by benlesh January 21, 2022
Thinking about the backpressure-related use cases for interop between async iterables and observable, I think I'd consider it an improvement to ergonomics to implement Symbol.asyncIterator
on Observable
. See this comment here about handling backpressure. There are some really cool/easy/clever things that can be done with this functionality.
Here's a few things to consider:
- rxjs-for-await has a good amount of usage already.
concatMap
has exactly the same issue where users need to "understand there is buffering" in some cases, and so far, I haven't seen many people trip over that. In fact, many tutorials and documents steer people towardsconcatMap
for this buffered, one-at-a-time behavior more often than not.for await
isn't going away any time soon, and — other than callbacks — is the only real native way to iterate async values (one-at-a-time likeconcatMap
, of course).- Subscribing to an observable with
for await
is obviously non-cancellable, as there's no subscription or even an opportunity to pass a signal or the like, so it's unlikely to "replace" callingsubscribe
in the hearts and minds of users. - Provides even better interop with IxJS and JavaScript in general.
For those new to this, here is what is being proposed (roughly):
for await (const value of someObservable$) {
await sleep(1000);
const subValue = await getAnotherValue(value);
doSomething(subValue);
}
Which would roughly map 1-to-1 with this RxJS behavior:
someObservable$.pipe(
concatMap(async (value) => {
await sleep(1000);
const subValue = await getAnotherValue(value);
doSomething(subValue);
})
)
.subscribe();