Angular 2/4 Обработка ошибок в URL-адресе forkjoin

Я использую angular 2, и я использую 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()).share())
    });
    return Observable.forkJoin(observableBatch);
  }

Это работает отлично. Но когда какой-либо из оставшихся вызовов терпит неудачу, весь forkjoin терпит неудачу. Так есть ли какой-либо способ выдать значения этих оставшихся вызовов и просто регистрировать, которые не удалось. ?? Пожалуйста помоги.


person Vikhyath Maiya    schedule 26.10.2017    source источник
comment
Перехватывайте и выдавайте любые ошибки (в виде значений) в составных HTTP-наблюдаемых объектах с помощью catch(error => Observable.of(error)), а затем проверяйте значения в массиве, выдаваемом forkJoin, чтобы увидеть, являются ли они экземплярами Error.   -  person cartant    schedule 26.10.2017
comment
Это в основном поможет мне зарегистрировать ошибку. Но как насчет тех оставшихся вызовов, которые увенчались успехом? Есть ли способ получить это и отобразить?   -  person Vikhyath Maiya    schedule 26.10.2017
comment
Какие вызовы были успешными, было бы очевидно, у вас были бы значения, отличные от Error, в массиве для них и значения Error для всех неудачных. Я напишу ответ, чтобы было понятнее.   -  person cartant    schedule 26.10.2017


Ответы (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 в противном случае.

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

person cartant    schedule 26.10.2017
comment
Даже для того, чтобы ваша обработка ошибок не зависела от того, какой тип объекта ошибки вызывается http-вызовом, вы можете обернуть объект ошибки в объект ошибки, специфичный для вашего приложения. Пример здесь stackblitz.com/edit/typescript-7xqy8g - person Nitul; 06.06.2020