gpt4 book ai didi

angular - 使用 RxJS 刷新/重新加载 Hot Observable 序列

转载 作者:太空狗 更新时间:2023-10-29 17:34:56 26 4
gpt4 key购买 nike

我正在使用 Angular 2 开发门户网站。登录时,我向服务器发出请求以获取已登录的用户配置文件。获取用户配置文件的方法返回一个可观察对象,当应用程序加载时,它在 6 个不同的地方被订阅。

如果我使用冷可观察对象,这将导致对服务器进行 6 次 API 调用。所以我通过添加 .publishLast().refCount() 切换到热可观察对象。

这导致单个请求共享数据,因为用户配置文件不会在后续请求中更新。

问题从这里开始:

现在我有一个编辑配置文件功能,它通过 HTTP PUT 更新用户配置文件,因此,我想使之前订阅的 Observables 过期,并以某种方式再次触发序列,以便再次执行 API 并接收订阅更新数据。

有什么方法可以重新启动/重新触发已订阅的可观察序列?

这是获取用户可观察对象的代码

fetch(){
this.userObservable = Observable.fromPromise(this.getToken())
.switchMap(token => {
let headers = new Headers();
headers.append('Authorization', `Bearer ${token}`);
return this.http.get('/api/v1/admin/users/me?includes=role', {headers: headers})
})
.map((res: Response) => {
let retVal: any = {
data: new Deserializer({
keyForAttribute: 'camelCase'
}).deserialize(res.json())
};
this.user = retVal.data as MpUser;
this.user.role = MpRoles[retVal.data.role[0].name];
return this.user;
})
.publishLast()
.refCount();
}

最佳答案

可以尝试引入subject来触发fetch:

private fetchTrigger = new BehaviorSubject(null);

triggerFetch() {
this.fetchTrigger.next();
}

fetch() {
this.userObservable = Observable
.combineLatest(
Observable.fromPromise(this.getToken()),
this.fetchTrigger
)
.switchMap(([token]) => {
...
})
...
.publishLast()
.refCount();
}

请注意,在此示例中,token 仅被检索一次。如果您需要在每次刷新时获取新 token :

private fetchTrigger = new BehaviorSubject(null);

triggerFetch() {
this.fetchTrigger.next();
}

fetch() {
this.userObservable = this.fetchTrigger
.switchMap(() => Observable.fromPromise(this.getToken()))
.switchMap(token => {
...
})
...
.publishLast()
.refCount();
}

关于angular - 使用 RxJS 刷新/重新加载 Hot Observable 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41563900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com