ReactiveX / rxjs

A reactive programming library for JavaScript
https://rxjs.dev
Apache License 2.0
30.68k stars 3k forks source link

ObservableInput<T> should support Thennable<T>, not PromiseLike<T> #7437

Open benlesh opened 8 months ago

benlesh commented 8 months ago

The type on ObservableInput is probably too strict.

We'll want to support Thennable<T> instead, as that's all that is required to convert with from et al.

interface Thennable<T> {
  then(onresolved?: ((value: T) => void) | null | undefined, onrejected?: ((reason: any) => void) | null | undefined): void;
}

The upside is we can then support more. The downside is if we decide we need to rely on the returned value of the then function, It'll require a breaking change.

Implementor note: We probably don't want to publicly expose Thennable, I'm sure a lot of folks already have that implemented in their codebase. It's been a mistake that we export * from types, honestly.

HirparaSEdit commented 8 months ago

// Define the Thennable interface interface Thennable { then(onresolved?: ((value: T) => void) | null | undefined, onrejected?: ((reason: any) => void) | null | undefined): void; }

// Function that takes an ObservableInput function processObservable(observable: Thennable) { // Simulate processing the observable observable.then( (value) => { console.log("Resolved:", value); }, (reason) => { console.error("Rejected:", reason); } ); }

// Example usage const myObservable: Thennable = { then: (onresolved, onrejected) => { // Simulate resolving the observable after a delay setTimeout(() => { if (Math.random() < 0.5) { onresolved?.("Success"); } else { onrejected?.("Failure"); } }, 1000); }, };

// Process the observable processObservable(myObservable);