Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(Subscription): Subscription now implements Symbol.dispose #7305

Merged
merged 2 commits into from
Aug 18, 2023

Conversation

benlesh
Copy link
Member

@benlesh benlesh commented Jul 12, 2023

Just an initial pass at implementing Symbol.dispose. Theoretical usage would be something like:

async function someLongRunningThing() {
  let valueFromObservable;

  // This is the usage.
  using someObservable$.subscribe(value => {
    valueFromObservable = value;
  })

  let n = 0;
  while (n++ < 10) {
    const userInput = await userInput();
    console.log(userInput + valueFromObservable);
  }

  // when this exits, the subscription will be "disposed".
}

cc @rbuckton

Related #7299

// Even though Subscriptoin only conditionally implements `Symbol.dispose`
// if it's available, we still need to declare it here so that TypeScript
// knows that it exists on the prototype when it is available.
export interface Subscription {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should probably move this interface to types.ts file (either being merged with the existing Subscription interface or added as a new one like here) so it's in one place altogether. Also, maybe documentation could be added as well.

Copy link
Member Author

@benlesh benlesh Jul 12, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have reasons I put it here actually:

  1. Because I'm literally doing this to extend the Subscription interface.
  2. I'm planning on a PR to move everything required in Observable to a single file (until I can split packages up)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought we already had Subscription interface, but we have SubscriptionLike which is not this one.

function execFinalizer(finalizer: Unsubscribable | (() => void)) {
if (isFunction(finalizer)) {
finalizer();
} else {
finalizer.unsubscribe();
}
}

// Ensure that `Symbol.dispose` is defined in TypeScript
declare global {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about this one being moved to types.ts file as well? Having it all in one place is better for maintaining.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above. Also I suspect this will be removed in soon-released versions of TypeScript

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I'm not wrong, it will be added in 5.2 (next release), as they are also adding support for using. Merged a few weeks ago microsoft/TypeScript#54505

Source code of disposable interfaces: https://github.com/microsoft/TypeScript/blob/main/src/lib/esnext.disposable.d.ts#L7

// Even though Subscriptoin only conditionally implements `Symbol.dispose`
// if it's available, we still need to declare it here so that TypeScript
// knows that it exists on the prototype when it is available.
export interface Subscription {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought we already had Subscription interface, but we have SubscriptionLike which is not this one.

src/internal/Subscription.ts Outdated Show resolved Hide resolved
Co-authored-by: Mladen Jakovljević <[email protected]>
Copy link
Member

@niklas-wortmann niklas-wortmann left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, pretty cool stuff!

@benlesh benlesh merged commit 9bb0341 into ReactiveX:master Aug 18, 2023
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants