Giter VIP home page Giter VIP logo

Comments (2)

demensky avatar demensky commented on September 24, 2024

It simply unsubscribes until complete happens. This can be clearly seen if more elements are passed to the second observable:

https://playcode.io/1846169

zip(
  of(1, 2).pipe(
    tap({
      next: n => console.log('1 nexted:', n),
      unsubscribe: () => console.log('1 unsubscribe'),
      complete: () => console.log('1 completed'),
    })
  ),
  of('a', 'b', 'c').pipe(
    tap({
      next: n => console.log('2 nexted:', n),
      unsubscribe: () => console.log('2 unsubscribe'),
      complete: () => console.log('2 completed'),
    })
  )
).subscribe({
  next: n => console.log('result', n),
  complete: () => console.log('the end'),
});

from rxjs.

al-mart avatar al-mart commented on September 24, 2024

I really dont think this is a bug. I see @jakovljevic-mladen tagged this as a bug but let me explain my analisis.
the tap operators inner subscription has unsubscribe and finalize methods.
If the subscription is terminated from the subscriber than the unsubscribe is called and then finalize.
But if the tap operators inner subscription have already been completed the unsubscribe is not called and only finalize is called. isUnsub flag.
The source.

complete: () => {
                isUnsub = false;
                tapObserver.complete?.();
                destination.complete();
              },
              finalize: () => {
                if (isUnsub) {
                  tapObserver.unsubscribe?.();
                }
                tapObserver.finalize?.();
              },

Also please see this examples

zip(
    interval(350).pipe(
        take(2),
        tap({
            next: n => console.log('A nexted:', n),
            unsubscribe: () => console.log('A unsubscribe'),
            complete: () => console.log('A completed'),
            finalize: () => console.log('A finalized'),
        })),
    interval(200).pipe(
        take(2),
        tap({
            next: n => console.log('B nexted:', n),
            unsubscribe: () => console.log('B unsubscribe'),
            complete: () => console.log('B completed'),
            finalize: () => console.log('B finalized'),
        }))
).subscribe({
    next: (n) => console.log('result', n),
    complete: () => console.log('the end'),
});

Result

B nexted: 0
A nexted: 0
result [ 0, 0 ]
B nexted: 1
B completed
B finalized
A nexted: 1
result [ 1, 1 ]
the end
A unsubscribe
A finalized

And second scenario

zip(
    interval(350).pipe(
        take(2),
        tap({
            next: n => console.log('A nexted:', n),
            unsubscribe: () => console.log('A unsubscribe'),
            complete: () => console.log('A completed'),
            finalize: () => console.log('A finalized'),
        })),
    interval(200).pipe(
        take(2),
        tap({
            next: n => console.log('B nexted:', n),
            unsubscribe: () => console.log('B unsubscribe'),
            complete: () => console.log('B completed'),
            finalize: () => console.log('B finalized'),
        }))
).pipe(take(1)).subscribe({
    next: (n) => console.log('result', n),
    complete: () => console.log('the end'),
});

RESULT

B nexted: 0
A nexted: 0
result [ 0, 0 ]
the end
A unsubscribe
A finalized
B unsubscribe
B finalized

The only difference here is the take operator in zip, which unsubscribes of the interval which unsubscribes from tap.
In this case the finalize method is called before complete, As the interval is not yet emitted all the values it has for us.
If you have any further questions I am ready to dig deeper unside this query and also I would be happy to know whether this is a correct assumption or no from Ben.

from rxjs.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.