Rx Js forkJoin: выполняется, когда все наблюдаемые ошибки или ошибки - PullRequest
0 голосов
/ 07 апреля 2020

Представьте, что у меня есть следующий код, в котором один наблюдаемый выдает ошибку, а другой преуспевает после задержки:

let observables: Observable<String>[] = [
  of("string 1").pipe(delay(1000)),
  throwError("error")
];

observables.forEach((observable, i) => {
  observable.subscribe(val => {
    console.log('success ' + i);
  }, error => {
    console.log('error ' + i);
  })
})

forkJoin(observables).subscribe(res => {
  console.log('final success');
}, error => {
  console.log('final error');
});

Этот код будет регистрировать следующее:

error 1
final error
success 0

Какой оператора или обратного вызова я мог бы использовать для выполнения некоторого кода после все наблюдаемые либо успешно, либо с ошибкой? Цель состоит в том, чтобы войти в следующем порядке:

error 1
success 0
final error

Другим приемлемым результатом было бы где-то поймать ошибку, и записать в журнал:

error 1
success 0
final success

Я сделал демо: https://stackblitz.com/edit/typescript-myfstw?file=index.ts

1 Ответ

1 голос
/ 07 апреля 2020

можно перехватить ошибку и закрыть поток.

вместо throwError("error") для подключения к нему канала throwError("error").pipe(catchError(() => EMPTY)), затем потоки с ошибками просто завершаются без ошибки / значения. если вам нужно значение, замените EMPTY на of('valueYouWant').

. Важно отловить ошибку в исходном потоке, а не в pipe после forkJoin.

для автоматизации catchError вы можете сделать

let observables: Observable<String>[] = [
  of("string 1").pipe(delay(1000)),
  throwError("error")
].map(obs => obs.pipe(catchError(() => EMPTY)));
...