50 lines
1.6 KiB
JavaScript
50 lines
1.6 KiB
JavaScript
import { Observable } from '../Observable';
|
|
import { subscribeToResult } from '../util/subscribeToResult';
|
|
import { OuterSubscriber } from '../OuterSubscriber';
|
|
/**
|
|
* We need this JSDoc comment for affecting ESDoc.
|
|
* @extends {Ignored}
|
|
* @hide true
|
|
*/
|
|
export class UsingObservable extends Observable {
|
|
constructor(resourceFactory, observableFactory) {
|
|
super();
|
|
this.resourceFactory = resourceFactory;
|
|
this.observableFactory = observableFactory;
|
|
}
|
|
static create(resourceFactory, observableFactory) {
|
|
return new UsingObservable(resourceFactory, observableFactory);
|
|
}
|
|
/** @deprecated internal use only */ _subscribe(subscriber) {
|
|
const { resourceFactory, observableFactory } = this;
|
|
let resource;
|
|
try {
|
|
resource = resourceFactory();
|
|
return new UsingSubscriber(subscriber, resource, observableFactory);
|
|
}
|
|
catch (err) {
|
|
subscriber.error(err);
|
|
}
|
|
}
|
|
}
|
|
class UsingSubscriber extends OuterSubscriber {
|
|
constructor(destination, resource, observableFactory) {
|
|
super(destination);
|
|
this.resource = resource;
|
|
this.observableFactory = observableFactory;
|
|
destination.add(resource);
|
|
this.tryUse();
|
|
}
|
|
tryUse() {
|
|
try {
|
|
const source = this.observableFactory.call(this, this.resource);
|
|
if (source) {
|
|
this.add(subscribeToResult(this, source));
|
|
}
|
|
}
|
|
catch (err) {
|
|
this._error(err);
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=UsingObservable.js.map
|