Search code examples
javascriptrxjsrxjs5behaviorsubjectsubject-observer

Why does piping a BehaviorSubject create an AnonymousSubject in RxJS?


When creating an RxJS BehaviorSubject, it stays a BehaviorSubject until it's pipe'd. As soon a pipe'd version is returned, it becomes an AnonymousSubject.

Examples:

// Instance of `BehaviorSubject`
const behaviorSubject$ = new BehaviorSubject({ someValue: null })

// Suddenly becomes an Anonymous Subject
const anonymousSubject$ = (
    behaviorSubject$
    .pipe(
        pluck('someValue')
    )
)

// Also suddenly becomes an Anonymous Subject
const anonymousSubject$ = (
    new BehaviorSubject({ someValue: null })
    .pipe(
        pluck('someValue')
    )
)

I experience this same issue with ReplaySubject as well. I can't seem to pipe through the subject and return that subject back. It always converts to an AnonymousSubject. I think what I'm looking for here is Promise-like behavior where I can subscribe to this observable from anywhere and grab the one value passed into it.


Solution

  • This is happening due to lift called on Subject.

    Let's take a deeper look at your example:

    1. You are instantiating a BehaviorSubject which extends Subject
    2. You are calling pluck operator which internally calls map operator
    3. map operator internally calls lift on BehaviorSubject which is delegated to Subject which then returns an AnonymousSubject