Угловая обработка ошибок 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
в противном случае.