343799e933c4bddaa433f1890525869b3c5e86db28afcdbc056c0476778702a946afa10abed7212beaee782838a08ac56e431f2681421f9b6e00ba27f272dd 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { Observable } from '../Observable';
  2. import { ObservableInput } from '../types';
  3. import { from } from './from';
  4. import { isArray } from '../util/isArray';
  5. import { EMPTY } from './empty';
  6. /* tslint:disable:max-line-length */
  7. export function onErrorResumeNext<R>(v: ObservableInput<R>): Observable<R>;
  8. export function onErrorResumeNext<T2, T3, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<R>;
  9. export function onErrorResumeNext<T2, T3, T4, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<R>;
  10. export function onErrorResumeNext<T2, T3, T4, T5, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<R>;
  11. export function onErrorResumeNext<T2, T3, T4, T5, T6, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<R>;
  12. export function onErrorResumeNext<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
  13. export function onErrorResumeNext<R>(array: ObservableInput<any>[]): Observable<R>;
  14. /* tslint:enable:max-line-length */
  15. /**
  16. * When any of the provided Observable emits an complete or error notification, it immediately subscribes to the next one
  17. * that was passed.
  18. *
  19. * <span class="informal">Execute series of Observables no matter what, even if it means swallowing errors.</span>
  20. *
  21. * ![](onErrorResumeNext.png)
  22. *
  23. * `onErrorResumeNext` Will subscribe to each observable source it is provided, in order.
  24. * If the source it's subscribed to emits an error or completes, it will move to the next source
  25. * without error.
  26. *
  27. * If `onErrorResumeNext` is provided no arguments, or a single, empty array, it will return {@link index/EMPTY}.
  28. *
  29. * `onErrorResumeNext` is basically {@link concat}, only it will continue, even if one of its
  30. * sources emits an error.
  31. *
  32. * Note that there is no way to handle any errors thrown by sources via the result of
  33. * `onErrorResumeNext`. If you want to handle errors thrown in any given source, you can
  34. * always use the {@link catchError} operator on them before passing them into `onErrorResumeNext`.
  35. *
  36. * ## Example
  37. * Subscribe to the next Observable after map fails</caption>
  38. * ```ts
  39. * import { onErrorResumeNext, of } from 'rxjs';
  40. * import { map } from 'rxjs/operators';
  41. *
  42. * onErrorResumeNext(
  43. * of(1, 2, 3, 0).pipe(
  44. * map(x => {
  45. * if (x === 0) throw Error();
  46. * return 10 / x;
  47. * })
  48. * ),
  49. * of(1, 2, 3),
  50. * )
  51. * .subscribe(
  52. * val => console.log(val),
  53. * err => console.log(err), // Will never be called.
  54. * () => console.log('done'),
  55. * );
  56. *
  57. * // Logs:
  58. * // 10
  59. * // 5
  60. * // 3.3333333333333335
  61. * // 1
  62. * // 2
  63. * // 3
  64. * // "done"
  65. * ```
  66. *
  67. * @see {@link concat}
  68. * @see {@link catchError}
  69. *
  70. * @param {...ObservableInput} sources Observables (or anything that *is* observable) passed either directly or as an array.
  71. * @return {Observable} An Observable that concatenates all sources, one after the other,
  72. * ignoring all errors, such that any error causes it to move on to the next source.
  73. */
  74. export function onErrorResumeNext<T, R>(...sources: Array<ObservableInput<any> |
  75. Array<ObservableInput<any>> |
  76. ((...values: Array<any>) => R)>): Observable<R> {
  77. if (sources.length === 0) {
  78. return EMPTY;
  79. }
  80. const [ first, ...remainder ] = sources;
  81. if (sources.length === 1 && isArray(first)) {
  82. return onErrorResumeNext(...first);
  83. }
  84. return new Observable(subscriber => {
  85. const subNext = () => subscriber.add(
  86. onErrorResumeNext(...remainder).subscribe(subscriber)
  87. );
  88. return from(first).subscribe({
  89. next(value) { subscriber.next(value); },
  90. error: subNext,
  91. complete: subNext,
  92. });
  93. });
  94. }