Правильный способ отловить ошибки с помощью async / await - PullRequest
1 голос
/ 18 февраля 2020

У меня есть приложение, в котором мне нужно ждать каждого ответа HTTP. Таким образом, вызовы должны выполняться в определенном порядке c, а некоторые из них требуют ответа другой службы. Я думал, что можно будет отловить ошибку в одном месте - метод root / main, где будет распространяться ошибка. Но, похоже, так не работает ... Возможно ли это? Или это означает, что мне нужно использовать блок try / catch в каждом методе, где я использую await ?? Давайте предположим, что этот псевдокод:

user.wrapper.service.ts

// Class which wraps real UserService with HTTP calls
export class UserWrapperService {
   async getUserById(id: number): Promise<UserResponse> {
      return await this.userService.getUser(id).toPromise() as UserResponse;
   }

   async getUserDetails(userName: string): Promise<UserDetailsResponse> {
      return await this.userService.getUserDetails(userName).toPromise() as UserDetailsResponse;
   } 
}

main-component.ts

export class MainComponent implements OnInit {

   async ngOnInit() {
      try {
         await this.retrieveDetailsForEachUser();
      } catch (e) {
        this.router.navigate(['/error']);
      }
   }

   private async retrieveDetailsForEachUser(): Promise<any> {
      for (let counter = 0; counter < 10; counter++) {
         const user = await this.userWrapperService.getUserById(counter);
         console.log(user);
         const details = await this.userWrapperService.getUserDetails(user.name);
         // use this details in another service with bigger method, where is present more async/await
      }
   }
}

Я надеялся, что если что-то будет go неправильно в методах UserWrapperService ошибка будет распространена и перехвачена в MainComponent. Или, по крайней мере, этого можно достичь. Но, похоже, мне нужно выдать исключение и попробовать / перехватить все async методы, которые для чего-то await. Я прав? Есть ли какой-нибудь более красивый способ сделать это? 1014 *

1 Ответ

0 голосов
/ 18 февраля 2020

Вы должны использовать блок try-catch при использовании asyn c -await для обработки ошибок, и вы делаете это правильно. Единственное, что мне кажется неправильным, это то, что вы ожидаете в методе service, возвращая результат асинхронного вызова c, который вернет вам Promise<Promise<UserResponse>, что не соответствует ожидаемому поведению.

Измените код, удалив ключевое слово await в классе обслуживания, как показано ниже, и ожидайте только в классе компонента.

user.wrapper.service.ts

export class UserWrapperService {
   async getUserById(id: number): Promise<UserResponse> {
      return this.userService.getUser(id).toPromise();
   }

   async getUserDetails(userName: string): Promise<UserDetailsResponse> {
      return this.userService.getUserDetails(userName).toPromise();
   } 
}

Теперь вы сможете ловить ошибки, обрабатывать их и переходить на страницу ошибок, как требуется в классе основного компонента.

...