Как мне вернуться к перехватчику после вызова исходного углового запроса 7 - PullRequest
0 голосов
/ 16 мая 2019

Мне удалось сделать исходный вызов после получения токена обновления, но я не могу понять, как вернуть результат в исходную вызывающую функцию.

Я создал перехватчик ошибок, чтобы проверить токен с истекшим сроком действия ..., а такжесохранить все входящие запросы.После успешного обновления токена должны быть вызваны все сохраненные запросы.Мне удалось добраться до точки, где исходный запрос срабатывает.Моя задача продолжается с того места, где разветвитель разветвляется, чтобы обновить токен.Это то, что я сделал до сих пор ..

Перехватчик ошибок

      retryWhen(incrementalRetry({
        scalingDuration: 2000,
        excludedStatusCodes: [500],
        headerAllow: request.headers.get('retry')
      })),
      catchError((err: HttpErrorResponse) => {

        if (err.error instanceof ErrorEvent) {
          errorMessage = `Error: ${err.error.message}`;
        } else {
          if (err.error instanceof ErrorEvent) {
            errorMessage = `Error: ${err.error.message}`;
          } else {
            if (err.status === 404) {
              console.log('Not Found');
            } else if (err.status === 500) {
              console.log('Server Error');
            } else if ((err.status === 401) && !AuthenticationService.gettingRefreshToken.value) {
              this.addRequestToQueue(request);
              // console.log(this.requestQueue);
              if (!AuthenticationService.gettingRefreshToken.value) {
                this.authenticationService.getRefreshToken().subscribe((res: any) => {
                  this.authenticationService.saveloggedInUser(res.accessToken, res.refreshToken);
                  AuthenticationService.gettingRefreshToken.next(false);
                  this.startRequest();
                });
              }
            } else {
              UtilityService.logout();
              // this.notificationService.showError('For security reasons, please log in again.', 'Authentication' +' Error';);
            }
          }
        }

        const error = err.error.message || err.statusText;
        if (request.headers.get('popup-error') === 'true') {
          alert('Error here');
          // this.notificationService.showError(error, 'Error');
        }
        return throwError(error);
      }));

Это напоминает оригинальный запрос

private addRequestToQueue(request) {
    this.queue.push(request);
  }

  private startRequest() {
    // get next request, if any.
    if (this.queue.length > 0) {
      this.execute(this.queue[0]);
    }
  }

  private execute(requestData: HttpRequest<any>) {

    if (requestData.method.toLowerCase() === 'get') {
      this.httpClient.get(requestData.url,
        Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
        .subscribe(res => {
          this.queue.shift();
          this.startRequest();
          return res;
        });
    } else if (requestData.method.toLowerCase() === 'post') {
      this.httpClient.post(requestData.url,
        requestData.body, Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
        .subscribe(res => {
          this.queue.shift();
          this.startRequest();
          return res;
        });
    } else if (requestData.method.toLowerCase() === 'delete') {
      this.httpClient.delete(requestData.url,
        Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
        .subscribe(res => {
          this.queue.shift();
          this.startRequest();
          return res;
        });
    } else if (requestData.method.toLowerCase() === 'put') {
      this.httpClient.put(requestData.url, requestData.body,
        Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
        .subscribe(res => {
          this.queue.shift();
          this.startRequest();
          return res;
        });
    }
  }

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

...