diff --git a/api_guard/dist/types/index.d.ts b/api_guard/dist/types/index.d.ts
index 1a14efdf385..fc981a8aa27 100644
--- a/api_guard/dist/types/index.d.ts
+++ b/api_guard/dist/types/index.d.ts
@@ -500,6 +500,9 @@ export declare function of(...values: A): Observab
export declare function onErrorResumeNext(sources: [...ObservableInputTuple]): Observable;
export declare function onErrorResumeNext(...sources: [...ObservableInputTuple]): Observable;
+export declare function onErrorResumeNextWith(sources: [...ObservableInputTuple]): OperatorFunction;
+export declare function onErrorResumeNextWith(...sources: [...ObservableInputTuple]): OperatorFunction;
+
export interface Operator {
call(subscriber: Subscriber, source: any): TeardownLogic;
}
diff --git a/api_guard/dist/types/operators/index.d.ts b/api_guard/dist/types/operators/index.d.ts
index 4d673c5b08b..9c5386e0cc8 100644
--- a/api_guard/dist/types/operators/index.d.ts
+++ b/api_guard/dist/types/operators/index.d.ts
@@ -191,8 +191,7 @@ export declare function multicast>(subjectFact
export declare function observeOn(scheduler: SchedulerLike, delay?: number): MonoTypeOperatorFunction;
-export declare function onErrorResumeNext(sources: [...ObservableInputTuple]): OperatorFunction;
-export declare function onErrorResumeNext(...sources: [...ObservableInputTuple]): OperatorFunction;
+export declare const onErrorResumeNext: typeof onErrorResumeNextWith;
export declare function pairwise(): OperatorFunction;
diff --git a/src/index.ts b/src/index.ts
index 759b3103af2..e267a625484 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -155,6 +155,7 @@ export { mergeWith } from './internal/operators/mergeWith';
export { min } from './internal/operators/min';
export { multicast } from './internal/operators/multicast';
export { observeOn } from './internal/operators/observeOn';
+export { onErrorResumeNextWith } from './internal/operators/onErrorResumeNextWith';
export { pairwise } from './internal/operators/pairwise';
export { pluck } from './internal/operators/pluck';
export { publish } from './internal/operators/publish';
diff --git a/src/internal/observable/onErrorResumeNext.ts b/src/internal/observable/onErrorResumeNext.ts
index 60fbceca396..ef62c033a11 100644
--- a/src/internal/observable/onErrorResumeNext.ts
+++ b/src/internal/observable/onErrorResumeNext.ts
@@ -1,8 +1,9 @@
import { Observable } from '../Observable';
import { ObservableInputTuple } from '../types';
-import { EMPTY } from './empty';
-import { onErrorResumeNext as onErrorResumeNextWith } from '../operators/onErrorResumeNext';
import { argsOrArgArray } from '../util/argsOrArgArray';
+import { OperatorSubscriber } from '../operators/OperatorSubscriber';
+import { noop } from '../util/noop';
+import { innerFrom } from './innerFrom';
/* tslint:disable:max-line-length */
export function onErrorResumeNext(sources: [...ObservableInputTuple]): Observable;
@@ -75,5 +76,26 @@ export function onErrorResumeNext(...sources: [...
export function onErrorResumeNext(
...sources: [[...ObservableInputTuple]] | [...ObservableInputTuple]
): Observable {
- return onErrorResumeNextWith(argsOrArgArray(sources))(EMPTY);
+ const nextSources: ObservableInputTuple = argsOrArgArray(sources) as any;
+
+ return new Observable((subscriber) => {
+ let sourceIndex = 0;
+ const subscribeNext = () => {
+ if (sourceIndex < nextSources.length) {
+ let nextSource: Observable;
+ try {
+ nextSource = innerFrom(nextSources[sourceIndex++]);
+ } catch (err) {
+ subscribeNext();
+ return;
+ }
+ const innerSubscriber = new OperatorSubscriber(subscriber, undefined, noop, noop);
+ nextSource.subscribe(innerSubscriber);
+ innerSubscriber.add(subscribeNext);
+ } else {
+ subscriber.complete();
+ }
+ };
+ subscribeNext();
+ });
}
diff --git a/src/internal/operators/onErrorResumeNext.ts b/src/internal/operators/onErrorResumeNextWith.ts
similarity index 70%
rename from src/internal/operators/onErrorResumeNext.ts
rename to src/internal/operators/onErrorResumeNextWith.ts
index 18ccd07ee69..9bcac812a45 100644
--- a/src/internal/operators/onErrorResumeNext.ts
+++ b/src/internal/operators/onErrorResumeNextWith.ts
@@ -1,15 +1,11 @@
-import { Observable } from '../Observable';
import { ObservableInputTuple, OperatorFunction } from '../types';
-import { operate } from '../util/lift';
-import { innerFrom } from '../observable/innerFrom';
import { argsOrArgArray } from '../util/argsOrArgArray';
-import { OperatorSubscriber } from './OperatorSubscriber';
-import { noop } from '../util/noop';
+import { onErrorResumeNext as oERNCreate } from '../observable/onErrorResumeNext';
-export function onErrorResumeNext(
+export function onErrorResumeNextWith(
sources: [...ObservableInputTuple]
): OperatorFunction;
-export function onErrorResumeNext(
+export function onErrorResumeNextWith(
...sources: [...ObservableInputTuple]
): OperatorFunction;
@@ -85,41 +81,19 @@ export function onErrorResumeNext(
* Observable, but - if it errors - subscribes to the next passed Observable
* and so on, until it completes or runs out of Observables.
*/
-export function onErrorResumeNext(
+export function onErrorResumeNextWith(
...sources: [[...ObservableInputTuple]] | [...ObservableInputTuple]
): OperatorFunction {
// For some reason, TS 4.1 RC gets the inference wrong here and infers the
// result to be `A[number][]` - completely dropping the ObservableInput part
// of the type. This makes no sense whatsoever. As a workaround, the type is
// asserted explicitly.
- const nextSources = (argsOrArgArray(sources) as unknown) as ObservableInputTuple;
+ const nextSources = argsOrArgArray(sources) as unknown as ObservableInputTuple;
- return operate((source, subscriber) => {
- const remaining = [source, ...nextSources];
- const subscribeNext = () => {
- if (!subscriber.closed) {
- if (remaining.length > 0) {
- let nextSource: Observable;
- try {
- nextSource = innerFrom(remaining.shift()!);
- } catch (err) {
- subscribeNext();
- return;
- }
-
- // Here we have to use one of our Subscribers, or it does not wire up
- // The `closed` property of upstream Subscribers synchronously, that
- // would result in situation were we could not stop a synchronous firehose
- // with something like `take(3)`.
- const innerSub = new OperatorSubscriber(subscriber, undefined, noop, noop);
- subscriber.add(nextSource.subscribe(innerSub));
- innerSub.add(subscribeNext);
- } else {
- subscriber.complete();
- }
- }
- };
-
- subscribeNext();
- });
+ return (source) => oERNCreate(source, ...nextSources);
}
+
+/**
+ * @deprecated Renamed. Use {@link onErrorResumeNextWith} instead. Will be removed in v8.
+ */
+export const onErrorResumeNext = onErrorResumeNextWith;
diff --git a/src/operators/index.ts b/src/operators/index.ts
index 9272c89780d..ebd6d60254c 100644
--- a/src/operators/index.ts
+++ b/src/operators/index.ts
@@ -57,7 +57,7 @@ export { mergeWith } from '../internal/operators/mergeWith';
export { min } from '../internal/operators/min';
export { multicast } from '../internal/operators/multicast';
export { observeOn } from '../internal/operators/observeOn';
-export { onErrorResumeNext } from '../internal/operators/onErrorResumeNext';
+export { onErrorResumeNext } from '../internal/operators/onErrorResumeNextWith';
export { pairwise } from '../internal/operators/pairwise';
export { partition } from '../internal/operators/partition';
export { pluck } from '../internal/operators/pluck';