Я пытаюсь использовать библиотеку 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());
}