ulo*_*oco 8 functional-programming observable rxjs typescript
有更优雅的方式做以下事情吗?
private getHeaders(): Observable<any> {
let version;
let token;
return this.appInfo.getVersion()
.pipe(
tap(appVersion => version = appVersion),
mergeMap(() => this.storage.get('access_token')),
tap(accessToken => token = accessToken),
mergeMap(accessToken => of(this.createHeaders(version, token)))
);
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能更流畅地记住两个返回值,this.appInfo.getVersion()而this.storage.get('access_token')不是用rxjs的强大功能将它们写入临时变量?
也许将一些可观测量合并为一个?rxjs有很多运算符和东西......
使用forkJoin:
.pipe(
mergeMap((appVersion) => forkJoin(
of(appVersion),
this.storage.get('access_token').take(1)
)),
mergeMap(([version, token]) => {
this.createHeaders(version, token)
})
)
Run Code Online (Sandbox Code Playgroud)
但更容易withLatestFrom:
.pipe(
withLatestFrom(this.storage.get('access_token')),
mergeMap(([version, token]) => {
this.createHeaders(version, token)
})
)
Run Code Online (Sandbox Code Playgroud)
我已将两者都包括在内因为withLatestFrom更容易,但forkJoin应该在需要访问初始参数的地方使用.例如,如果你在做this.storage.get(appVersion)
你可能想尝试这样的事情
private getHeaders(): Observable<any> {
return this.appInfo.getVersion()
.pipe(
mergeMap(version => this.storage.get('access_token')
.map(token => ({version, token})),
map(data => this.createHeaders(data.version, data.token))
);
}
Run Code Online (Sandbox Code Playgroud)
带 ZIP 的替代版本
private getHeaders(): Observable<any> {
const versionObs = this.appInfo.getVersion();
const tokenObs = this.storage.get('access_token');
return Observable.zip(versionObs, tokenObs)
.pipe(
map(data => this.createHeaders(data[0], data[1]))
);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5362 次 |
| 最近记录: |