Moh*_*han 5 rxjs rxjs5 angular
我正在使用Angular 2中的Portal.在登录时,我向服务器发出请求以获取登录的用户配置文件.获取用户配置文件的方法返回一个observable,它在应用程序加载时在6个不同的位置订阅.
如果我使用了cold observable,这将导致对服务器的6个API调用.所以我通过添加.publishLast().refCount()切换到热观察.
这导致单个请求共享数据,因为用户配置文件不会在后续请求中更新.
问题从这里开始:
现在我有一个编辑配置文件功能,它通过HTTP PUT更新用户配置文件,因此,我想使先前订阅的Observables到期并以某种方式再次触发序列,以便再次执行API并且订阅接收更新的数据.
有什么方法可以重新启动/重新触发已订阅的可观察序列吗?
这是fetch用户可观察的代码
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();
}
Run Code Online (Sandbox Code Playgroud)
您可以尝试引入subject触发器获取:
private fetchTrigger = new BehaviorSubject(null);
triggerFetch() {
this.fetchTrigger.next();
}
fetch() {
this.userObservable = Observable
.combineLatest(
Observable.fromPromise(this.getToken()),
this.fetchTrigger
)
.switchMap(([token]) => {
...
})
...
.publishLast()
.refCount();
}
Run Code Online (Sandbox Code Playgroud)
请注意,此示例token仅检索一次.如果您需要在每次刷新时获得新令牌:
private fetchTrigger = new BehaviorSubject(null);
triggerFetch() {
this.fetchTrigger.next();
}
fetch() {
this.userObservable = this.fetchTrigger
.switchMap(() => Observable.fromPromise(this.getToken()))
.switchMap(token => {
...
})
...
.publishLast()
.refCount();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1885 次 |
| 最近记录: |