使用场景是这样的:
我有N个模块都要获取用户信息,当第一个模块去调用时就去调用后台接口,后面的不过就直接用这个数据
这N个模块不分先后,有的模块可能调用时获取用户信息已经调用完成,即直接获取最后一次发布的数据即可
求帮助,谢谢
使用场景是这样的:
我有N个模块都要获取用户信息,当第一个模块去调用时就去调用后台接口,后面的不过就直接用这个数据
这N个模块不分先后,有的模块可能调用时获取用户信息已经调用完成,即直接获取最后一次发布的数据即可
求帮助,谢谢
问题没有补充前置条件,比如:rxjs的版本
另外,这个问题不需要用rxjs来解决,可以参考以下思路:
1.定义一个变量,let promiseStatus = false;
2.所有模块发起请求之前,先判断promiseStatus是否为false,如果是再发起请求
3.当其中任意一个模块发起请求的时候,将 promiseStatus = true;
4.请求完成之后,将promiseStatus = false 重置为 false
如果一定要使用rxjs来解决,可以使用操作符 last(以下代码的rxjs版本为6.x)
import { last } from 'rxjs/operators';
const example = source$.pipe(last());
example.subscribe(value => { console.log(value); })
看意思,你可能是想用RXJS来做缓存。标题的最后不太恰当,换成最近可能做更好些。
如果是想规避冗余的请求,建议使用share操作符,以获取当前登录用户为例:
public getCurrentLoginUser$(): Observable<User> {
const api = 'xxx/xxxx';
return this.httpClient.get<User>(url).pipe(share());
}
在使用share
操作符时要注意两点:
总结:一般用它来规避冗余的请求。比如100个请求向同一个api发起,那么使用share则能够保证只请求1次。
如果想让使缓存的时间更长一些(手动清空),则可以使用BaviorSubject
,代码大概长这样:
private currentLoginUserSubject = new BehaviorSubject<User>(null);
public getCurrentLoginUser$(): Observable<User> {
if (this.currentLoginUserSubject.getValue() == null) {
this.getCurrentLoginUser().subscribe(user => {
this.currentLoginUserSubject.next(user);
});
}
return this.currentLoginUserSubject.asObservable();
}
private getCurrentLoginUser(): Observable<User> {
const api = 'xxx/xxxx';
return this.httpClient.get<User>(url).pipe(share());
}
结合使用share、BehaviorSubject,可以达到:即不发起冗余的请求,又缓存了相关的数据的作用。
而至于last
操作符,应该是指:在数据源执行complete()
方法时,转发数据源中最后发送的数据。但如果数据源并未执行commplete
方法,则订阅者将得不到数据。应该与你的需求并不相符。
最后上述代码未实测,水平有限可能有错误。
希望能够帮到你。
或许
BehaviorSubject
可以帮到你,参考 30 天精通 RxJS(23): Subject, BehaviorSubject, ReplaySubject, AsyncSubject