【发布时间】:2018-06-05 11:28:00
【问题描述】:
我正在使用角异步本地存储模块在本地存储中设置令牌的到期时间。
import { AsyncLocalStorage } from 'angular-async-local-storage';
const expiresAt = JSON.stringify((authResult.expiresIn * 1000) + new Date().getTime());
this.localStorage.setItem('expires_at', expiresAt).subscribe(() => {});
然后我有一个在用户登录时调用的函数,它检查令牌是否仍然有效:
get isAuthenticated(): boolean {
let res;
this.localStorage.getItem('expires_at')
.subscribe((val) => {
let expiresAt = JSON.parse(val);
res = (expiresAt && this.loggedIn) ? (new Date().getTime() < expiresAt) : false;
});
return res;
}
这里的问题是 localStorage.getItem() 返回一个 Observable。 所以当我们在 observable 上调用 .subscribe 时,它是异步调用的,这意味着在结果准备好之前我们不会阻塞 所以代码直接执行return res语句,此时res是未定义的,因为订阅箭头函数中的代码还没有执行,因为结果还没有准备好。
所以我需要一些建议来解决这个问题的最佳方法是什么? 我想到的一种方法是尝试阻塞直到结果准备好,但鉴于我们使用的是 ASYNC 本地存储模块,这似乎是一种反模式。 但也许我需要的只是一个简单的同步本地存储模块?或者这被认为是不好的做法? 任何帮助都会非常感谢!
【问题讨论】:
-
这个方法
isAuthenticated()是在服务中还是在组件中? -
它在一个类中,即 @Injectable export class Foo { ... isAuthenticated() } 。这对我应该如何处理异步调用有影响吗?
-
您介意显示更多此文件吗?
@Injectable应该是服务文件而不是组件文件。
标签: angular typescript asynchronous rxjs local-storage