Угловая маршрутизация внутри наблюдаемой / подписываемой записи http

#angular #angular-router #angular10 #angular-observable

#угловая #угловой маршрутизатор #angular10 #угловой-наблюдаемый

Вопрос:

Я пытаюсь направить пользователя на панель мониторинга внутри response httpClient.post запроса. Страница перемещается «хорошо» (она отображается в строке URL), но большинство элементов DOM компонентов не загружаются.

Это сообщение в service.ts:

 import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { retry, catchError } from 'rxjs/operators';

const baseUrl = 'https://my-api.com';

@Injectable({
  providedIn: 'root'
})
export class ApiService {

  constructor(private httpClient: HttpClient) { }

  postSomeData(data): Observable<any> {
    return this.httpClient.post(baseUrl   '/postSomeData', data)
  }
 

И вот как я использую это в компоненте:

 this.apiService.postSomeData(params)
            .subscribe(
              async response => {
                response = await response;
                if(response.response == 'success'){
                  // success logic

                }else{
                  // failure message
                }
              },
              error => {
                // error logic
              },
              () => {
                // window.top.location.href = "https://"   window.location.host;
                this.router.navigate(["/dashboard"]);
              });
 

Когда процесс subscribe завершен и маршрутизатор переходит к панели мониторинга, это неполная загрузка DOM панели мониторинга, которую я получаю:
введите описание изображения здесь

Если я помещаю навигацию ( this.router.navigate(["/dashboard"]); ) в любом месте за пределами подписки или перезагружаю страницу вручную или программно ( window.top.location.href = "https://" window.location.host; ), страница (DOM) загружается просто отлично: введите описание изображения здесь

Итак, как я могу реализовать навигацию внутри подписки и получить полную загрузку DOM компонента панели мониторинга? Очевидно complete , что функция внутри подписки не работает для меня. Закомментированная полная перезагрузка страницы ( window.top.location.href = "https://" window.location.host; ) в полной функции работает, но это не угловой способ.

Ответ №1:

Первый ответ, возвращенный из a subscribe , выполняется, когда HTTP-метод был успешным, поэтому нет необходимости проверять ответ.

Второй ответ выполняется при ошибке.

Таким образом, на самом деле вы могли бы значительно упростить свой код, просто выполнив следующее:

 this.apiService.postSomeData(params)
            .subscribe(
              () => {
                // success logic, HTTP statuscode 20X
              },
              () => {
                // error logic, when a HTTP error has been thrown
              },
              () => {
                // executed when the HTTP function has been completed, doesn't matter whether success or error
                this.router.navigate(["/dashboard"]);
              });
 

Я думаю, что проблема была связана с async if предложением and — . Там нет причин использовать async и if -предложение. Это должно это исправить.

Вы всегда можете использовать debugger в своем коде, чтобы увидеть, когда выполняется функция. Если вы не полностью понимаете, когда какая часть subscribe выполняется, я рекомендую сделать это несколько раз.