|
import { isScheduler } from '../util/isScheduler'; |
|
import { Observable } from '../Observable'; |
|
import { subscribeOn } from '../operators/subscribeOn'; |
|
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs'; |
|
import { observeOn } from '../operators/observeOn'; |
|
import { AsyncSubject } from '../AsyncSubject'; |
|
export function bindCallbackInternals(isNodeStyle, callbackFunc, resultSelector, scheduler) { |
|
if (resultSelector) { |
|
if (isScheduler(resultSelector)) { |
|
scheduler = resultSelector; |
|
} |
|
else { |
|
return function (...args) { |
|
return bindCallbackInternals(isNodeStyle, callbackFunc, scheduler) |
|
.apply(this, args) |
|
.pipe(mapOneOrManyArgs(resultSelector)); |
|
}; |
|
} |
|
} |
|
if (scheduler) { |
|
return function (...args) { |
|
return bindCallbackInternals(isNodeStyle, callbackFunc) |
|
.apply(this, args) |
|
.pipe(subscribeOn(scheduler), observeOn(scheduler)); |
|
}; |
|
} |
|
return function (...args) { |
|
const subject = new AsyncSubject(); |
|
let uninitialized = true; |
|
return new Observable((subscriber) => { |
|
const subs = subject.subscribe(subscriber); |
|
if (uninitialized) { |
|
uninitialized = false; |
|
let isAsync = false; |
|
let isComplete = false; |
|
callbackFunc.apply(this, [ |
|
...args, |
|
(...results) => { |
|
if (isNodeStyle) { |
|
const err = results.shift(); |
|
if (err != null) { |
|
subject.error(err); |
|
return; |
|
} |
|
} |
|
subject.next(1 < results.length ? results : results[0]); |
|
isComplete = true; |
|
if (isAsync) { |
|
subject.complete(); |
|
} |
|
}, |
|
]); |
|
if (isComplete) { |
|
subject.complete(); |
|
} |
|
isAsync = true; |
|
} |
|
return subs; |
|
}); |
|
}; |
|
} |
|
|