基于另一个可观察的可观察地图属性

时间:2020-04-22 08:47:36

标签: javascript rxjs observable

可以说我有一个可观察到的发出雇员的信号。

$employees

我希望基于Observable操纵每个员工的子属性。例如,假设显示名称。

目前我正在执行这样的任务。

const getDisplayName = (emp) => {}; //returns an observable

const mapFn = async (emp) => {
    emp.displayName = await getDisplayName(emp).toPromise();

    return emp;
}

$employees
    .pipe(mergeMap(mapFn));

我认为我的困惑是,据我所知,我们有两个方面。根$employeesgetDisplayName。我的理解是,使用各种合并运算符,根值将被辅助流的值替换。没有合并。

在我不需要转换为承诺但还可以映射员工财产的情况下,有更好的方法吗?

谢谢。

2 个答案:

答案 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的含义很重要。让我知道是否是这种情况。