可以说我有一个可观察到的发出雇员的信号。
$employees
我希望基于Observable操纵每个员工的子属性。例如,假设显示名称。
目前我正在执行这样的任务。
const getDisplayName = (emp) => {}; //returns an observable
const mapFn = async (emp) => {
emp.displayName = await getDisplayName(emp).toPromise();
return emp;
}
$employees
.pipe(mergeMap(mapFn));
我认为我的困惑是,据我所知,我们有两个方面。根$employees
和getDisplayName
。我的理解是,使用各种合并运算符,根值将被辅助流的值替换。没有合并。
在我不需要转换为承诺但还可以映射员工财产的情况下,有更好的方法吗?
谢谢。
答案 0 :(得分:1)
这应该有效:
const emp$ = from([1, 2, 3]);
function getName(emp: number): Observable<string> {
return of(emp.toString());
}
const empNameTuple$ = emp$.pipe(mergeMap(emp => {
return getName(emp).pipe(map(name => [emp, name]));
}))
在这里,我只是返回[number, string]
的元组,但是您可以根据需要映射它。
答案 1 :(得分:1)
您想做的事情:
$employees
.pipe(mergeMap(employees => {
return forkJoin(employees.map(emp => getDisplayName(emp).pipe(
map(displayName => ({...emp, ...{displayName}}))
)))
}));
如果您真的想要一个打破的mapFn:
const mapFn = employees => {
return forkJoin(employees.map(emp => getDisplayName(emp).pipe(
map(displayName => ({...emp, ...{displayName}}))
)));
}
$employees
.pipe(mergeMap(mapFn))
始终建议不要混合使用rxjs和async / await。它们是处理异步操作的不同方法,效果不佳。 mergeMap
需要您返回一个可观察对象,forkJoin
在并行中执行可观察对象,因此您需要将所有映射到其getName
函数中的员工加入该员工,然后将该名称映射到原始员工中并返回它。
编辑:以上是$eployees
正在释放一组雇员的情况。如果只是一个员工,请执行以下操作:
const mapFn = emp => {
return getDisplayName(emp).pipe(
map(displayName => ({...e, ...{displayName}}))
);
}
但是,如果它要多次解雇一个雇员(或一组雇员),那么了解使用mergeMap
vs switchMap
vs concatMap
的含义很重要。让我知道是否是这种情况。