Angular 在CANActive中设置延迟,直到获取IP地址数据

Angular 在CANActive中设置延迟,直到获取IP地址数据,angular,angular-router,canactivate,angular-guards,Angular,Angular Router,Canactivate,Angular Guards,我正在为我的angular应用程序做一个防护,除了某些IP之外,所有用户都应该重定向到维护页面。我使用第三方API获取客户端IP地址,如http://api.ipify.org/?format=json。我面临的问题是,在IP API发送响应之前执行canActivate guard,因此总是返回false,然后加载响应 激活功能 canActivate(): boolean | Observable<boolean> { if (this.globalService.g

我正在为我的angular应用程序做一个防护,除了某些IP之外,所有用户都应该重定向到维护页面。我使用第三方API获取客户端IP地址,如
http://api.ipify.org/?format=json
。我面临的问题是,在IP API发送响应之前执行canActivate guard,因此总是返回false,然后加载响应

激活功能

  canActivate(): boolean | Observable<boolean> {
    if (this.globalService.getCanactivateStatus()) {
      return true;
    } else {
      this._router.navigate(["/en/maintainance"]);
      return false;
    }
  }
canActivate():布尔值|可观察{
if(this.globalService.getCanactivateStatus()){
返回true;
}否则{
这是路由器导航([“/en/maintance]”);
返回false;
}
}
服务

  getUserIp() {
    this.http.get<{ ip: string }>("http://api.ipify.org/?format=json").subscribe((data) => {
      this.clientIP = data.ip;
    });
  }

  getCanactivateStatus() {
    this.getUserIp()
      if (this.maintainance_status) {
        if (this.IpArray.indexOf(this.clientIP) !== -1) { //this.clientIP waits for response while canactivated gets executed
          return true
         }
      } else return true 
  }
getUserIp(){
这是http.get(“http://api.ipify.org/?format=json)订阅((数据)=>{
this.clientIP=data.ip;
});
}
getCanactivateStatus(){
这个文件名为getUserIp()
if(此维护状态){
if(this.IpArray.indexOf(this.clientIP)!=-1){//this.clientIP在执行canactivated时等待响应
返回真值
}
}否则返回true
}

您可以尝试返回一个可观察值,而不是真/假,并对其进行过滤,以便在满足以下条件时触发:

return this.globalService.getCanactivateStatus()
        .pipe(
          filter((status) => !!status),
          take(1)
        )

您应该在getCanactivateStatus()中实现返回逻辑来完成这项工作

您能再解释一下吗