angular - 如果 http.get 在 Guard canActivate 函数中成功,则返回 true 的函数
问题描述
我想创建一个函数,如果 http.get 成功则返回 true,否则返回 false。我正在尝试这样的事情:
isOk() {
let isOk;
this.http.get('ip/api/isOk')
.subscribe(x => { isOk = true; },
(err) => { isOk = false; });
return isOk;
}
但它返回undefined
。我知道它是一个异步函数,所以它在http.get
完成之前返回一个值。如何在从 REST API “接收”数据后创建一个返回真/假的函数?
编辑:我想在 Guard 函数中使用这个canActivate
函数。我不知道如何用 observable 构造 IF 语句。
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
let x = this.someService.isOk();
if(...){//if isOk return true
return true;
}else{
this.router.navigate(['/login']);
}
}
解决方案
您正在尝试混合不兼容的东西:同步和异步代码。http.get
是异步的,这意味着完全遵循:在大多数情况下,当您的代码返回给调用者时还没有结果;这就是为什么undefined
返回的唯一合理价值。
一旦你坚持异步工作流,就永远保持下去。在您的特定情况下,您可能希望返回Observable<boolean>
给调用者并让它subscribe()
而不是自己做。考虑pipe()
和map()
或tap()
定义为Observable<>
. rxjs文档。
推荐阅读
- php - 表单数据通过ajax和foreach一起上传多个文件
- gitlab - Gitlab CI不保留作业之间其他目录的node_modules
- javascript - Visual Studio Code - 将 Javascript 文件链接到 HTML 文件
- python - 识别砖墙上的砖块
- haskell - 为什么`Applicative Maybe`的`pure`被定义为`pure = Just`而忽略`Nothing`?
- nuxt.js - nuxt.js 构建时没有静态文件夹
- c - fgets() / gets() 问题,同时输入 N 个字符串。在初始位置不接受输入
- angular - Angular 6 - 如何将服务函数指向 JSON 对象而不执行它
- c++ - 通用 lambdas、重载、std::is_invocable 和 SFINAE - GCC 和 Clang 之间的不同行为
- python - ImportError:在 AppEngine 标准本地没有名为 grpc._cython.cygrpc 的模块