Angular 2+ разрешает данные маршрута

Я хочу вернуть данные из API в угловом преобразователе маршрута, но если в данных API есть какая-либо ошибка из-за устаревшего токена, я бы снова обновил токен и нажал тот же API. Ниже приведен код для него.

import { CommonUtlitiesService } from './../services/commonutilities.service';
import { UserService } from './../services/user.service';
import { Injectable } from '@angular/core';

import { Resolve } from '@angular/router';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/delay';

@Injectable()
export class CurrentUserProfileResolver implements Resolve<any> {
  constructor(private userservice:UserService,
  private commonservice:CommonUtlitiesService) {}

  resolve() {
    return  this.getactiveuserinfo();

  }

  getactiveuserinfo(maxcount=3){

  //get user data
  this.userservice.getactiveuseraccountData().subscribe(res => {
        console.log(res);
        return res;
    },
      (err) => {
         //refresh stale token
        this.commonservice.refreshToken().subscribe(res => {
          maxcount--;
          if (maxcount > 0) {
            //again hit The API
            this.getactiveuserinfo(maxcount - 1);
          }
        });

      });

  }
}

Код службы для userservice выглядит следующим образом:

getactiveuseraccountData(){

    return this.http.post(url, dataSend, options)
      .map(res => res.json());
  }

В моем компоненте я получаю данные как:

 let data= this.route.snapshot.data.userdata;

но это не содержит никакого ответа API.

Если я изменю свой код в распознавателе, чтобы напрямую попасть в службу, он работает нормально. Например:

import { CommonUtlitiesService } from './../services/commonutilities.service';
import { UserService } from './../services/user.service';
import { Injectable } from '@angular/core';

import { Resolve } from '@angular/router';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/delay';

@Injectable()
export class CurrentUserProfileResolver implements Resolve<any> {
  constructor(private userservice:UserService,
  private commonservice:CommonUtlitiesService) {}

  resolve() {
//this works fine
    return  userservice.getactiveuseraccountData()

  }

помогите разобраться в проблеме


person jalak vora    schedule 04.03.2018    source источник
comment
Вы можете увидеть консольное сообщение res?   -  person happyZZR1400    schedule 04.03.2018
comment
@happyZZR1400 сообщение консоли имеет правильный ответ API, но оно вызывается после загрузки данных преобразователя моего компонента.   -  person jalak vora    schedule 04.03.2018
comment
хорошо, если тогда - я думаю, ваша проблема в том, что распознаватель ожидает получить наблюдаемое, которое не срабатывает в случае ошибки. я думаю, вам нужно обернуть всю свою логику с помощью new observable() и вызвать next вместо возврата res   -  person happyZZR1400    schedule 04.03.2018


Ответы (1)


попробуйте обернуть всю логику метода getactiveuserinfo наблюдаемым:

getactiveuserinfo(maxcount=3){
    return new  Observable((observer) => {
            //get user data
             this.userservice.getactiveuseraccountData().subscribe(res => {
                console.log(res);
                // return res;
                observer.next(res);
              },
              (err) => {
                 //refresh stale token
                this.commonservice.refreshToken().subscribe(res => {
                  maxcount--;
                  if (maxcount > 0) {
                    //again hit The API
                    this.getactiveuserinfo(maxcount - 1);
                  }
                });

              });

      })   
  }

надеюсь, это поможет

person happyZZR1400    schedule 04.03.2018