Angular 从多个可观测数据中获取结果<;布尔值>;-角形5路障

Angular 从多个可观测数据中获取结果<;布尔值>;-角形5路障,angular,rxjs,observable,subscribe,Angular,Rxjs,Observable,Subscribe,在Angular 5中,我使用两个服务调用来查看是否应该允许用户查看页面,这是使用Route guard。然而,对于RXJS,我不确定处理这个问题的最佳方法 import { Injectable } from '@angular/core'; import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { AuthService } from

在Angular 5中,我使用两个服务调用来查看是否应该允许用户查看页面,这是使用Route guard。然而,对于RXJS,我不确定处理这个问题的最佳方法

import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AuthService } from './auth.service';
import { SponsorService } from '../sponsor.service';
import Rxjs = require("rxjs");
import { Observable } from 'rxjs/Observable';
import { map } from 'rxjs/operators';
import { Subscription } from 'rxjs';

@Injectable()
export class SponsorGuard implements CanActivate {

  constructor(
    private readonly auth: AuthService,
    private readonly sponsorService: SponsorService,
    private readonly router: Router) {
  }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {

   // console.log(this.isSponsor());
    //console.log(this.isValidSponsor(route));

   // return true;

    if (this.isSponsor() && this.isValidSponsor(route)) {
      return true;
    };
    return false;
  };

//  canGoToSponsorPage() : Subscription {
//    const isSponsorObservable = this.isSponsor();
//    const isValidSponsorRecordObservable = this.isValidSponsor();
//    const arrayOfRequests = [isSponsorObservable, isValidSponsorRecordObservable];
//
//      return Observable.forkJoin(arrayOfRequests).subscribe(results => {
//
//        const result = (results[0] && results[1]);
//      });
//  }

  isSponsor(): Observable<boolean> {

    return this.auth.isSponsor().map(isSponsor => {

      if (!isSponsor) {
        console.log("getting redirected");

        this.router.navigateByUrl('home');
        return false;
      }

      console.log("access granted");
      return true;
    });
  }

  isValidSponsor(route: ActivatedRouteSnapshot) : Observable<boolean> {

    const sponsorId = Number(route.params["sponsorId"]);
    const applicationId = Number(route.params["applicationId"]);

    console.log(sponsorId);
    console.log(applicationId);

    return this.sponsorService.getSponsorDetails(sponsorId, applicationId).map(validSponsorRecord => {

      console.log(validSponsorRecord);

      if (!validSponsorRecord) {
        console.log("getting redirected");
        return false;
      }

      console.log("access granted");
      return true;
    });
  };
};
我认为这是检查对象是否为null,而不是检查服务调用的结果是否返回true或false


如何处理这个问题有什么建议吗?

可观察的价值是在未来。它包在里面。您不能直接访问它。要实现这一点,必须使用rxjs操作符来操作输出

对于这种情况,您必须等待使用
forkJoin
返回结果的两个可观察对象
canActivate
方法可以接受可观察的输出。因此,代码将是:

从'rxjs'导入{forkJoin};
...
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察{
返回forkJoin(this.isSponsor(),this.isvalidponsor(route)).pipe(
映射([a,b])=>a和b)
);
};

可观察值是未来的值。它包在里面。您不能直接访问它。要实现这一点,必须使用rxjs操作符来操作输出

对于这种情况,您必须等待使用
forkJoin
返回结果的两个可观察对象
canActivate
方法可以接受可观察的输出。因此,代码将是:

从'rxjs'导入{forkJoin};
...
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察{
返回forkJoin(this.isSponsor(),this.isvalidponsor(route)).pipe(
映射([a,b])=>a和b)
);
};

使用
forkJoin
。例如
返回forkJoin(this.isSponsor()、this.isvalidponsor(route))
使用
forkJoin
。例如
返回forkJoin(this.isSponsor(),this.isvalidponsor(route))
    if (this.isSponsor() && this.isValidSponsor(route)) {
      return true;
    };
    return false;
  };