rxjs 怎么做到不管何时获取数据都能获取到最后一次的数据

发布于 2022-09-12 04:37:51 字数 135 浏览 17 评论 0

使用场景是这样的:
我有N个模块都要获取用户信息,当第一个模块去调用时就去调用后台接口,后面的不过就直接用这个数据
这N个模块不分先后,有的模块可能调用时获取用户信息已经调用完成,即直接获取最后一次发布的数据即可

求帮助,谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

伴梦长久 2022-09-19 04:37:51

问题没有补充前置条件,比如: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); })
半夏半凉 2022-09-19 04:37:51

看意思,你可能是想用RXJS来做缓存。标题的最后不太恰当,换成最近可能做更好些。

如果是想规避冗余的请求,建议使用share操作符,以获取当前登录用户为例:

public getCurrentLoginUser$(): Observable<User> {
   const api = 'xxx/xxxx';
   return this.httpClient.get<User>(url).pipe(share());
}

在使用share操作符时要注意两点:

  1. 返回的Observable最少需要有一个订阅者,否则其不会发起订阅。
  2. 当所有的订阅者都取消订阅时,它会取消对源的订阅

总结:一般用它来规避冗余的请求。比如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方法,则订阅者将得不到数据。应该与你的需求并不相符。


最后上述代码未实测,水平有限可能有错误。

希望能够帮到你。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文