Вы не возвращаете ничего из своего getScreenShot()
, кроме Promise<void>
, но это только из-за async
. Также кажется, что первые 2 вызова не зависят друг от друга, поэтому вы можете выполнять их параллельно:
Это означает, что, чтобы просто исправить вашу проблему, вам нужно реорганизовать свой getScreenShot()
метод:
getScreenShot() {
return this.zone.runOutsideAngular(async () => {
const canvas = await html2canvas(document.getElementById("capture"));
return new Promise(
(resolve) => canvas.toBlob((blob) => resolve(blob), 'image/png')
);
});
}
Короче говоря, верните вызов this.zone
, дождитесь вызова html2canvas
, создайте новое обещание и верните его в своем решении. Также не используйте ключевое слово function
, потому что это испортит контекст this
.
Более длительное исправление, которое потребует рефакторинга вашего кода, будет выглядеть примерно так:
logError(response: { message: string }): void {
forkJoin([
this.getIPAddress(),
this.getScreenShot()
]).pipe(
concatMap(([ { ip }, screenshot ]) => this.logErrorRequest({
ExceptionMessage: response.message,
ipAddress: ip,
screenshot
}))
).subscribe({
next: () => console.log('error logged'),
error: () => console.log('make sure to catch this to prevent loop!')
});
}
Очевидно, здесь будет использован рефакторинговый метод getScreenShot
. Как вы могли заметить, это намного яснее и позволяет избежать случайных назначений this
. Это хороший поток, точно так же, как rx js хочет чего-то.
Также убедитесь, что вы каким-то образом отклоняете / группируете журнал ошибок, чтобы предотвратить переполнение или бесконечное l oop ошибок. зарегистрирован. Поверьте, бывает: D