angular - 可观察的返回空值
问题描述
我有一个尝试登录检查角色的子模块。
this.auth.user$.subscribe(u => console.log(u)) // Child returning null
服务
private user: BehaviorSubject<User> = new BehaviorSubject<User> (null);
user$: Observable<User> = this.user.asObservable();
async getUser() {
try {
const { token, claims, expirationTime } = await (await this.afAuth.currentUser).getIdTokenResult(true);
const { name, email } = claims;
const expiry = Date.parse(expirationTime);
const authDetails = { token, name, email, expiry };
if (claims.claims && claims.claims.length === 1) {
const { groupId, role } = claims.claims[0];
this.user.next({ ...authDetails, groupId, role });
} else if (claims.claims && claims.claims.length > 1) {
this.user.next({ ...authDetails, allClaims: claims.claims });
}
return this.user;
} catch (err) {
throw err;
}
}
我已将 Service 作为提供者放入所有模块中
我究竟做错了什么 ?
解决方案
根据我对您描述中以下行的理解
我已将 Service 作为提供者放入所有模块中
事情不起作用,因为您正在访问服务的新实例,并且您需要一个单例实例才能访问该值。
要么我们这样做: -
@Injectable({
providedIn: 'root',
})
export class YourService {
}
或仅在Appmodule的提供者中为单例实例添加服务
所以,我会推荐尝试以上两种方法中的任何一种,一切都会对你有用。
*删除所有模块提供程序阵列的服务。并且要么使用 提供 的方式,要么只添加AppModule的提供者。那么你有一个服务的单例实例,将获得行为主体和所有其他服务状态的正确值。
推荐阅读
- mysql - Sequelize 不会在填充的表上创建外键列
- c++ - 如何在嵌入式设备上设置 FTP 客户端连接?
- java - 我收到此错误:HTTP 状态 500 – 内部服务器错误(Eclipse、Tomcat8.5、Java)
- javascript - 多次加载javascript文件不起作用
- solr - Apache Solr Reindexing 无法处理大量记录
- javascript - 在 vanilla JavaScript 中将 LI 从一个 UL 移动到另一个?
- lightgbm - LightGBM:训练指标
- html - 组织 HTML 导致元素之间的空间
- python - Python合并多个子字符串
- java - 如何在特定时间触发图像的特定动画?