【问题标题】:angular7 Route guards and sync http subscribe [duplicate]angular7路由保护和同步http订阅[重复]
【发布时间】:2019-05-01 07:58:33
【问题描述】:

我在 angular7 Route Guards 服务中使用 httpclient 时遇到问题。 因为我必须从后台服务器获取结果来判断是否通过。 但是httpclient服务是异步的,所以变量canPass总是为假,怎么处理呢? 任何意见将不胜感激。 这是我的代码:

judgePass(route: string): Observable<CommonResult> {
const url = `${this.baseUrl}/check`;
const formData = new FormData();
formData.append('url', route);
return this.httpClient.post<CommonResult>(url, formData, {});
}

canPass: boolean = false;

canActivate(route: ActivatedRouteSnapshot, state: 
    RouterStateSnapshot):boolean {
    this.authService.judgePass(state.url).subscribe(res => {
        let code = res['code'];
        if (code == 0) {
            this.canPass = true;
        } else {
            this.message.create('error', res.message);
            this.canPass = false;
        }
    });
    return this.canPass;
}

【问题讨论】:

  • 只需在if else 块内返回this.canPass
  • thx,但是函数 canActivate 必须有一个布尔变量才能返回
  • 不行,订阅会在main函数返回后执行。您不能从订阅中返回!它会破坏订阅的优势。

标签: angular typescript rxjs


【解决方案1】:

您的代码不起作用,因为您没有等待返回值,并立即返回this.canPass,而它的值尚未分配。

如您所见in the Angular docs,您完全可以返回一个可观察对象。

只需返回 observable,如下所示:

canActivate(route: ActivatedRouteSnapshot, state: 
    RouterStateSnapshot): Observable<boolean> {
    return this.authService.judgePass(state.url).pipe(map(res => {
        let code = res['code'];
        if (code == 0) {
            return true;
        } else {
            this.message.create('error', res.message);
            return false;
        }
    }));
}

pipe / map 的东西只是跳入 observable 并将结果更改为 true/false

还有其他方法,其中使用async/await,如this SO post,虽然我更喜欢上面的解决方案。

【讨论】:

  • 那么你建议 OP 在哪里订阅judgePass 函数?没有订阅,调用将不会执行
  • 不需要,Angular 框架自己做的。
  • 其实是重复的,我会举报的。
  • 它没有,也从来没有(不确定 angularjs,但无论如何都是不同的)。这就是订阅功能的重点。没有它,它只会声明 http 调用,但它只会在订阅后执行
猜你喜欢
  • 2020-06-09
  • 2021-07-09
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 2010-09-24
  • 2017-03-10
  • 2019-08-13
  • 2019-09-15
相关资源
最近更新 更多