Angular 9 rxJs-如何使用combine/merge语句检索可观察值并传递给另一个函数
我有一项服务,让我打开一个小吃吧:Angular 9 rxJs-如何使用combine/merge语句检索可观察值并传递给另一个函数,angular,rxjs,Angular,Rxjs,我有一项服务,让我打开一个小吃吧: this.snackBarService.open(title, body); title和body是字符串 我遇到的问题是,它们都需要从键进行翻译,翻译服务返回一个可观察的: /** * Returns an observable for a translation based on the key * * @param key the translation key */ private getTranslation(ke
this.snackBarService.open(title, body);
title
和body
是字符串
我遇到的问题是,它们都需要从键进行翻译,翻译服务返回一个可观察的:
/**
* Returns an observable for a translation based on the key
*
* @param key the translation key
*/
private getTranslation(key: string): Observable<string> {
return this.translocoService.selectTranslate(key, {}, 'auth');
}
但什么也没发生…控制台不记录任何内容:(
要订阅和取消订阅getTranslation的两个调用会有点乏味……那么,有没有简单的方法可以从两个可观察的调用中获取值并将其传递到snackbar?我相信只有使用
forkJoin
就足够了
forkJoin([
this.getTranslation('snackbar.username.success.title'),
this.getTranslation('snackbar.username.success.body'))
]).订阅(
响应=>{
log('here',响应[0],响应[1]);
打开(响应[0],响应[1]);
}
);
forkJoin
仅当两个观察值都已完成时才会发出。如果未完成,则可以使用combinelatetest
和管道中的take(1)
仅使用从观察值发出的第一个值并完成
组合测试([
this.getTranslation('snackbar.username.success.title'),
this.getTranslation('snackbar.username.success.body'))
]).烟斗(
采取(1)
).订阅(
响应=>{
log('here',响应[0],响应[1]);
打开(响应[0],响应[1]);
}
);
我之前尝试过forkJoin,但被卡住了。感谢您指出它只会在完成时发出(因为我现在知道翻译服务没有完成!)。您的更新回答CombineTest非常有效。感谢您的快速响应!
this.getTranslation('snackbars.username.success.title').pipe(
mergeMap(title => {
return combineLatest(
of(title),
this.getTranslation('snackbars.username.success.body')
);
}),
map(([title, body]) => {
console.log('here', title, body);
this.snackBarService.open(title, body);
})
);