Обработка ошибок, вызванных обещанием, в наблюдаемой, созданной из () - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь использовать библиотеку AngularFire в приложении Angular.Некоторые из вызовов AngularFire возвращают обещания, и я хотел бы обрабатывать их как наблюдаемые, а не для согласованности во всем приложении.Я использую rxjs v6

Использование from() работает хорошо и дает ожидаемое поведение, за исключением случаев, когда возникают ошибки.

Если обещание выдает исключение, наблюдаемая не видит егои трассировка стека выгружается в консоль со словами Error: Uncaught (in promise).

Моя первая попытка

Вызов AngularFire, который возвращает обещание:

deleteCampaign(id: string) {
  return from(this.campaignCollection.doc(id).delete());
}

Код вызова:

    deleteCampaign(id: string) {
        return this.dataStorageService.deleteCampaign(id)
        .pipe(
            catchError(
                err => {
                    console.log('error when deleting campaign');
                    console.log(err);
                    return throwError(err);
                }
            )
        );
    }

В этом случае я получаю трассировку стека в консоли, и catchError никогда не срабатывает.

Моя вторая попытка

Я добавил catch к обещанию внутри from, а затем попытался отбросить ошибку как наблюдаемую, чтобы она выглядела так:

    deleteCampaign(id: string) {
        return from(this.campaignCollection.doc(id).delete().catch(
            err => {
                throwError(err);
            }
        ));
    }

Мой третийпопытка

Так же, как и вторая попытка, но я попытался выдать простую ошибку JavaScript.Однако это привело к той же трассировке стека и не было замечено наблюдаемой.

    deleteCampaign(id: string) {
        return from(this.campaignCollection.doc(id).delete().catch(
            err => {
                throw(err);
            }
        ));
    }

Это остановило трассировку стека, так как теперь обещание ловило его, но вызывающий код по-прежнемуникогда не видит ошибку.

Я поступаю неправильно?Я предположил, что при использовании from() вся обработка ошибок может происходить в наблюдаемой, и я мог оставить обещание в покое.

Мне нужно иметь возможность: 1. Не иметь кода обработки ошибок, гдеобещание возвращается и пусть наблюдаемое позаботится об этом.1. У блока обещания catch есть возможность перебрасывать ошибку, обнаруженную наблюдаемой.


Вот решение, к которому пришли:

Из компонента переднего плана обработайте переданныйошибка при использовании обратного вызова error в subscribe

  onDelete(id: string) {
    this.loadingCampaigns = true;
    this.campaignService.deleteCampaign(id).subscribe(
      _ => {},
      err => {
        console.log('error detection from the component');
      }
    );
  }

Из службы кампании tap() ошибка, чтобы ее можно было зарегистрировать или иным образом:

    deleteCampaign(id: string) {
        return this.dataStorageService.deleteCampaign(id)
        .pipe(
            tap(null, () => {console.log('tapped the error');} ),
        );
    }

Наконец, изкомпонент хранения данных вообще ничего не делает:

    deleteCampaign(id: string) {
        return from(this.campaignCollection.doc(id).delete());
    }

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Вы можете прикрепить сообщение об ошибке к Observable.subscribe().

Rx.Observable.from(Promise.reject('Boo!'))
    .subscribe(val => {
        console.log('success');
    },
    err => {
        console.log(err);
    });
// Boo!
0 голосов
/ 09 июля 2019
deleteCampaign(id: string) {
  return from(this.campaignCollection.doc(id).delete()).pipe(catchError(err=>{
      return throwError(err);
    }))
}

deleteCampaign(myid).susbcribe(res=>{
    console.log(res);
},error=>{
    console.log(error)
})

Я привел пример использования модального режима ng-bootstrap, который при открытии модального окна возвращает обещание - преобразовать в Observable в this stackblitz

...