1- import { Observable } from '../Observable' ;
1+ import { Observable , SubscribableOrPromise } from '../Observable' ;
22import { Subscriber } from '../Subscriber' ;
33import { Subscription } from '../Subscription' ;
44
5+ import { subscribeToResult } from '../util/subscribeToResult' ;
6+ import { OuterSubscriber } from '../OuterSubscriber' ;
57/**
68 * We need this JSDoc comment for affecting ESDoc.
79 * @extends {Ignored }
810 * @hide true
911 */
1012export class UsingObservable < T > extends Observable < T > {
1113
12- static create < T > ( resourceFactory : ( ) => Subscription ,
13- observableFactory : ( resource : Subscription ) => Observable < T > ) : Observable < T > {
14+ static create < T > ( resourceFactory : ( ) => Subscription | void ,
15+ observableFactory : ( resource : Subscription ) => SubscribableOrPromise < T > | void ) : Observable < T > {
1416 return new UsingObservable < T > ( resourceFactory , observableFactory ) ;
1517 }
1618
17- constructor ( private resourceFactory : ( ) => Subscription ,
18- private observableFactory : ( resource : Subscription ) => Observable < T > ) {
19+ constructor ( private resourceFactory : ( ) => Subscription | void ,
20+ private observableFactory : ( resource : Subscription ) => SubscribableOrPromise < T > | void ) {
1921 super ( ) ;
2022 }
2123
2224 protected _subscribe ( subscriber : Subscriber < T > ) : Subscription | Function | void {
23-
2425 const { resourceFactory, observableFactory } = this ;
2526
26- let resource : Subscription ,
27- source : Observable < T > ,
28- error : any , errorHappened = false ;
27+ let resource : Subscription ;
2928
3029 try {
31- resource = resourceFactory ( ) ;
32- } catch ( e ) {
33- error = e ;
34- errorHappened = true ;
30+ resource = < Subscription > resourceFactory ( ) ;
31+ return new UsingSubscriber ( subscriber , resource , observableFactory ) ;
32+ } catch ( err ) {
33+ subscriber . error ( err ) ;
3534 }
35+ }
36+ }
3637
37- if ( errorHappened ) {
38- subscriber . error ( error ) ;
39- } else {
40- subscriber . add ( resource ) ;
41- try {
42- source = observableFactory ( resource ) ;
43- } catch ( e ) {
44- error = e ;
45- errorHappened = true ;
46- }
38+ class UsingSubscriber < T > extends OuterSubscriber < T , T > {
39+ constructor ( destination : Subscriber < T > ,
40+ private resource : Subscription ,
41+ private observableFactory : ( resource : Subscription ) => SubscribableOrPromise < T > | void ) {
42+ super ( destination ) ;
43+ destination . add ( resource ) ;
44+ this . tryUse ( ) ;
45+ }
4746
48- if ( errorHappened ) {
49- subscriber . error ( error ) ;
50- } else {
51- return source . subscribe ( subscriber ) ;
47+ private tryUse ( ) : void {
48+ try {
49+ const source = this . observableFactory . call ( this , this . resource ) ;
50+ if ( source ) {
51+ this . add ( subscribeToResult ( this , source ) ) ;
5252 }
53+ } catch ( err ) {
54+ this . _error ( err ) ;
5355 }
5456 }
55- }
57+ }
0 commit comments