Угловая обработка ошибок 2/4 в URL forkjoin
Я usimg angular 2, и я использую forkjoin для одного из сценариев, где я должен выполнить несколько вызовов rest параллельно.Следование-моя функция
private getBatchObservableData(data: Array<Widget>): Observable<any> {
let observableBatch = [];
data.forEach(widget => {
observableBatch.push(this._http.get(widget.apiPath).delay(500).map((data) => data.json()).share())
});
return Observable.forkJoin(observableBatch);
}
Это работает совершенно нормально.Но когда какой-либо из остальных вызовов терпит неудачу, wholeforkjoin fails.So существует ли какой-либо способ выдавать значения тех вызовов rest и просто регистрировать, которые завершились неудачей. ?? Пожалуйста помочь.
1 ответ:
Если вы используете
catchдля предотвращения ошибок, возникающих при вызовеforkJoin, Вы можете повторно выдать их в виде значений и проверить значения в дополнительной функции проектаforkJoin:В приведенном выше примере будет выделен объект, содержащий два массива, каждый из которых будет содержать то же количество элементов, что и массивprivate getBatchObservableData(data: Array<Widget>): Observable<any> { let observableBatch = []; data.forEach(widget => observableBatch.push(this._http .get(widget.apiPath) .delay(500) .map(data => data.json()) .catch(error => Observable.of(error)) )); return Observable.forkJoin(observableBatch, (...results) => ({ failed: results.map(r => r instanceof Error ? r : null), succeeded: results.map(r => r instanceof Error ? null : r) }) ); }data:Должно быть легко перестроить вещи, если вам нужно сделать что-то немного по-другому.
- элементы в
failedбудут содержатьError, если соответствующий запрос не удался иnullв противном случае.- элементы в
succeededбудут содержать данные, если соответствующий запрос удался иnullв противном случае.