是否有更优雅的方式来执行以下操作?
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)))
);
}
如何更好地流利地记住this.appInfo.getVersion()
和this.storage.get('access_token')
的两个返回值,而不将它们写入具有rxjs功能的临时变量?
也许将一些观察结果合并为一个? 有很多rxjs运算符和东西......
答案 0 :(得分:5)
使用forkJoin
:
.pipe(
mergeMap((appVersion) => forkJoin(
of(appVersion),
this.storage.get('access_token').take(1)
)),
mergeMap(([version, token]) => {
this.createHeaders(version, token)
})
)
但使用withLatestFrom
更容易:
.pipe(
withLatestFrom(this.storage.get('access_token')),
mergeMap(([version, token]) => {
this.createHeaders(version, token)
})
)
我之所以包括两者,是因为withLatestFrom
更容易,但是在需要访问初始参数的地方应使用forkJoin
。例如,如果您正在做this.storage.get(appVersion)
答案 1 :(得分:4)
使用forkJoin,它是针对此类情况而设计的。
答案 2 :(得分:3)
你可能想尝试这样的事情
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))
);
}
带邮政编辑的替代版
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]))
);
}