import { Observable } from '../Observable'; import { AsyncSubject } from '../AsyncSubject'; import { map } from '../operators/map'; import { canReportError } from '../util/canReportError'; import { isArray } from '../util/isArray'; import { isScheduler } from '../util/isScheduler'; export function bindCallback(callbackFunc, resultSelector, scheduler) { if (resultSelector) { if (isScheduler(resultSelector)) { scheduler = resultSelector; } else { return (...args) => bindCallback(callbackFunc, scheduler)(...args).pipe(map((args) => isArray(args) ? resultSelector(...args) : resultSelector(args))); } } return function (...args) { const context = this; let subject; const params = { context, subject, callbackFunc, scheduler, }; return new Observable(subscriber => { if (!scheduler) { if (!subject) { subject = new AsyncSubject(); const handler = (...innerArgs) => { subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); subject.complete(); }; try { callbackFunc.apply(context, [...args, handler]); } catch (err) { if (canReportError(subject)) { subject.error(err); } else { console.warn(err); } } } return subject.subscribe(subscriber); } else { const state = { args, subscriber, params, }; return scheduler.schedule(dispatch, 0, state); } }); }; } function dispatch(state) { const self = this; const { args, subscriber, params } = state; const { callbackFunc, context, scheduler } = params; let { subject } = params; if (!subject) { subject = params.subject = new AsyncSubject(); const handler = (...innerArgs) => { const value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; this.add(scheduler.schedule(dispatchNext, 0, { value, subject })); }; try { callbackFunc.apply(context, [...args, handler]); } catch (err) { subject.error(err); } } this.add(subject.subscribe(subscriber)); } function dispatchNext(state) { const { value, subject } = state; subject.next(value); subject.complete(); } function dispatchError(state) { const { err, subject } = state; subject.error(err); } //# sourceMappingURL=bindCallback.js.map