Angular 5 (RxJS) - вызвать массив подписок, затем выполнить код - PullRequest
0 голосов
/ 11 ноября 2018

Ответ на мой основной вызов подписки возвращает массив некоторых значений.Эти значения передаются в качестве аргументов в массив моих дочерних подписок.В этих подписках я хочу присвоить значения dataArr - когда подписка получает ошибку «Не найдено», я хочу назначить пользовательское значение.Когда вызываются все подписки, я хочу выполнить окончательный код после последнего вызова подписки.

Проблема в том, что я не могу добиться этого с помощью forkJoin, потому что согласно документации RxJS "Если внутренняя наблюдаемая не завершает forkJoinникогда не будет выделять значение! "Я тоже пробовал операторы слияния и конкатата.Есть идеи?

this.service.get().subscribe(response => {
  this.observables = [];
  this.dataArr = [];

  response.items.forEach(item => {
    this.observables.push(this.otherService.get(item.data))
    // I want this subscription to make this action
    // this.otherService.get(item.data).subscribe(
    //   response => {
    //     this.dataArr.push({
    //       title: response.title,
    //     });
    //   },
    //   error => {
    //     this.dataArr.push({
    //       title: 'Not found!',
    //     });
    //   }
    // )
  });

  Observable.forkJoin(this.observables).subscribe(
    res => {
      console.log(res)
    }, err => {
      console.log(err);
    }, () => {
      console.log('Completed!');
      // execute other code on completion
    }
  );
});

1 Ответ

0 голосов
/ 12 ноября 2018

Вы можете использовать forkJoin!

https://www.learnrxjs.io/operators/combination/forkjoin.html

Имейте в виду, что если какая-либо из внутренних наблюдаемых, предоставленная для ошибки forkJoin, вы потеряете значение любых других наблюдаемых, которые выполнили или уже завершили , если вы не уловите ошибку правильно на внутренней наблюдаемой . Если вас интересует только успешное завершение всех внутренних наблюдаемых, вы можете обнаружить ошибку снаружи.

Итак, просто убедитесь, что когда наблюдаемая ошибка выдаст ошибку, она все равно что-нибудь вернет:

    forkJoin(
        this.service.observableA.pipe(
            map(data => {
                return { result: 'succes', data: data };
            }),
            catchError(err => {
                console.log(err);
                return of({ result: 'failed', data: null });
            })
        ),
        this.service.observableB.pipe(
            map(data => {
                return { result: 'succes', data: data };
            }),
            catchError(err => {
                console.log(err);
                return of({ result: 'failed', data: null });
            })
        )
    ).subscribe(
        // This will be triggered even if one of the observables fail
    );

Конечно, в методе подписки вам нужно будет просмотреть список и проверить, являются ли свойства «result» «succes» или «fail» для каждого возвращенного ответа.

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