It's there to avoid StackOverflow as `request` can be invoked synchronously (such as in `take`) anywhere in the chain as a result of the `onNext`.

To see further discussion on related topics you can review this: https://github.com/reactive-streams/reactive-streams/blob/master/README.md I'm also involved in that and the intent is that `request` can be called synchronously from a `Subscriber` so it doesn't have to worry about it, but the `Producer` must assume it can be called synchronously and thus needs to ensure a recursive loop doesn't happen.