Observable.combineПоследние продолжаются, даже если не получится - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть функция, которая должна разрешать несколько документов из firebase

  fetchDocuments(documentIds: string[]): Observable<TreeNodeDocument[]> {
    const observables = [];
    for(let id of documentIds){
      observables.push(this.fetchDocument(id));
    }
    return Observable.combineLatest(observables, (...docs: TreeNodeDocument[]) => {
      //some transformations on the resolved documents
      return docs;
    });
  }

this.fetchDocument(id) возвращает наблюдаемое типа TreeNodeDocument.

Эта функция работает до тех пор, пока все документы могут быть разрешены. Теперь иногда случается, что некоторые документы не могут быть разрешены, тогда соответствующая наблюдаемая fetchDocument(id) потерпит неудачу. Это нормально и ожидается, что некоторые документы не могут быть решены. Однако Observable.combineLatest завершается неудачей полностью, если один из них дает сбой (я понимаю, это хорошее поведение по умолчанию).

Теперь у меня вопрос, могу ли я использовать combineLatest таким образом, чтобы я получал только те документы, с которыми работала выборка, и просто игнорировал те, на которых произошел сбой? Или я могу достичь этого по-другому?

Приветствия

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете направить каждый исходный объект Observable (каждый this.fetchDocument(id)) с catchError, который заменит уведомление error на фиктивный элемент next (или все, что вы захотите).

for (let id of documentIds){
  observables.push(this.fetchDocument(id).pipe(
    catchError(() => of(null)),
  ));
}

...

Обратите внимание, что вы не можете использовать только empty() или of(), потому что оба они не будут испускать какой-либо элемент next, а combineLatest не будет работать, как вы ожидаете. Конечно, вместо null вы можете использовать все, что захотите. Массив документов будет иметь null в индексах, где исходная наблюдаемая ошибка не удалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...