Angular цепочка запросов - остановить выполнение следующих запросов если статус ответа 404

Рейтинг: 2Ответов: 1Опубликовано: 27.02.2023

Я хочу выполнить последовательную цепочку запросов (5шт.), в которой каждый следующий запрос зависит от результата предыдущего. Собственно что я хочу:

  1. Получить юзера из сервиса
  2. Записать в сервис данные соц. аккаунта юзера (в данном случае ВК)
  3. Получить соц. аккаунт из сервиса
  4. Установить группы пользователя в сервисе
  5. Получить группы пользователя из сервиса

Я написал метод, который вызываю в ngOnInit. Метод работает отлично, пока в каждом запросе ответ 200. Как только в любом из запросов ответ 404, то все рушится.

Я хочу сделать следующее: если в одном из запросов пришел ответ 404, то вывести сообщение и следующие запросы не выполнять. Как это реализовать?

    getUserWithSocialAccount(){
        this.loadingService.showLoading(MessagesLoading.vkGroupSearch)
        this.subscription_1 = this.userService.getUser().pipe(
          switchMap((user: any) => {
            // this.user = user
            this.userName = user.name
            return this.userService.setSocialAccountByUserId(user.id)
          }),
          tap(() => {
             this.getSocialAccount()
          }),
          switchMap(() => {
            return this.userService.setVkGroups(this.socialAccount.provider_id, this.socialAccount.token)
          }),
          tap(() => {
             this.getVkGroups()
          }),
          catchError(errors => {
            if(errors.status === '404'){
              this.toastService.showToast(MessagesErrors.vkGroupSearch, 'secondary')
              this.loadingService.hideLoading()
            }
            return 'EMPTY';
          }),
        ).subscribe()
      }

Ответы

▲ 0Принят

В общем я сделал на беке возврат юзера с отношением social_account и на фронте сделал сделующее

 getUserWithSocialAccount(){
this.loadingService.showLoading(MessagesLoading.vkGroupSearch)
this.subscription_1 = this.userService.getUser().pipe(
  switchMap((user: any) => {
    this.user = user
    if(!user.social_account){
      this.toastService.showToast(MessagesErrors.vkGroupSearch, 'secondary')
      this.loadingService.hideLoading()
      return of([]);
    } else {
      return this.userService.setVkGroups(user.social_account.provider_id, user.social_account.token).pipe(
        tap(() => {
            this.getVkGroups()
        }),
      )
    }
    
  }),
).subscribe()

}