【问题标题】:Observable map property based on another observable基于另一个可观察对象的可观察地图属性
【发布时间】:2020-08-05 05:24:50
【问题描述】:

假设我有一个可观察到的发射员工。

$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。我的理解是,对于各种合并运算符,根值将被辅助流的值替换。未合并。

有没有更好的方法来做到这一点,我不需要转换为承诺,但也可以映射员工的属性?

谢谢。

【问题讨论】:

  • 这是否回答了您的问题:stackoverflow.com/questions/44004144/…?
  • 我认为你所拥有的是正确的。
  • 我认为您不需要转换为 Promise。这个$employees .pipe(mergeMap(getDisplayName)) 应该可以工作

标签: javascript rxjs observable


【解决方案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 需要你返回一个 observable,forkJoin 以并行方式执行 observable,所以你加入映射到他们的 getName 函数中的所有员工,然后将名称映射到原始员工并返回它。

编辑:以上是$eployees 是否发出员工数组。如果只是一个员工,请这样做:

const mapFn = emp => {
  return getDisplayName(emp).pipe(
    map(displayName => ({...e, ...{displayName}}))
  );
}

但是,如果它多次发出单个员工(或一组员工),了解使用 mergeMapswitchMapconcatMap 的含义很重要。如果是这样,请告诉我。

【讨论】:

    【解决方案2】:

    这应该可行:

    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] 的元组,但你可以随意映射它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2020-01-25
      • 2017-07-12
      相关资源
      最近更新 更多