Наблюдаемое свойство карты на основе другого наблюдаемого - PullRequest
0 голосов
/ 22 апреля 2020

Допустим, у меня есть наблюдаемое, которое испускает сотрудников.

$employees

I w * sh для управления подчиненным свойством каждого сотрудника на основе наблюдаемого. Для примера, скажем, отображаемое имя.

В настоящее время я выполняю задачу, подобную этой. root $employees и getDisplayName. Насколько я понимаю, с различными операторами слияния значение root будет заменено значением вторичного потока. Не объединено с.

Есть ли лучший способ сделать это, когда мне не нужно переходить в обещание, но можно просто сопоставить свойство сотрудника?

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

вы хотите сделать:

$employees
    .pipe(mergeMap(employees => {
      return forkJoin(employees.map(emp => getDisplayName(emp).pipe(
        map(displayName => ({...emp, ...{displayName}}))
      )))
    }));

, если вы действительно хотите разбитую карту. Fn:

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

$employees
    .pipe(mergeMap(mapFn))

всегда советуйте не смешивать rx js и asyn c / await , Это разные методы обработки асин c операций, и они не очень хороши. mergeMap требует от вас возврата наблюдаемой, forkJoin выполняет наблюдаемые в parralel, поэтому вы объединяете всех своих сотрудников, сопоставленных с их функциями getName, а затем сопоставляете имя с исходным сотрудником и возвращаете его.

РЕДАКТИРОВАТЬ: выше, если $eployees выделяет массив сотрудников. если это всего лишь один сотрудник, выполните:

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

однако, если он выдает одного сотрудника (или массив сотрудников) несколько раз, важно понимать последствия использования mergeMap против switchMap против concatMap. Дайте мне знать, если это так.

1 голос
/ 22 апреля 2020

Это должно сработать:

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], но вы можете отобразить его, как вам угодно sh.

...