Вы можете использовать mergeMap
для сопоставления с новой наблюдаемой и toArray
для сбора излучаемых значений в массиве. Используйте catchError
для обработки ошибок в ваших потоках и сопоставления с альтернативной наблюдаемой при ошибках.
Этот код будет работать так же, как и ваш код, с массивом пропущенных вопросов, содержащим все вопросы до тех пор, пока getDrafts
не выдаст ошибку и исключит вопросы, для которых getResponses
выдал ошибку.
getDrafts().pipe(
mergeMap(draft => getResponses(draft.responseKey).pipe(
toArray(),
map(responses => ({ title: draft.title, responses } as Question)),
catchError(error => { console.error(error); return EMPTY; })
)),
catchError(error => { console.error(error); return EMPTY; }),
toArray()
).subscribe(qs => { console.log(qs); questions = qs; })
Имейте в виду, что questions
в конечном массиве не обязательно будет в том же порядке, что и входящий drafts
. Порядок зависит от того, как быстро завершается getResponses
Observable для конкретного draft
. (Это то же поведение, что и ваш текущий код)
Чтобы убедиться, что questions
будет в том же порядке, что и drafts
, вы можете использовать concatMap
вместо mergeMap
. Но это может замедлить общее выполнение задачи, поскольку ответы на следующий draft
будут выбраны только после того, как ответы на предыдущий draft
завершены.