Использование массива наблюдаемых функций с выводом каждого элемента в качестве следующего элемента ввода - PullRequest
2 голосов
/ 15 апреля 2019

У меня есть массив функций, которые возвращают наблюдаемые, которые я хотел бы выполнить последовательно, используя вывод каждой наблюдаемой функции в качестве следующего ввода функций, пока не будет вызвана каждая функция в массиве.

Как мне лучше всего выполнитьвернуть это как одну наблюдаемую?

Тип функции, который у меня есть массив:

export type FilterFn = (items: Item[]) => Observable< Item[] >;

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Вы можете использовать Array.reduce для объединения каждого fn с оператором switchMap

Как это:

fns.reduce(
  (acc, fn) => acc.pipe( switchMap(fn) ) // switchMap to next fn result
  , of(undefined)                        // initial value to pass to the first fn
)
  .subscribe(result=>{
    console.log(result);
  })

Вот пример детской площадки для этого .

0 голосов
/ 16 апреля 2019

Если вы хотите, чтобы ваша цепочка Observables не только испускала результат конечной функции, но и отправляла результат каждого Observable, возвращаемого функцией между ними, вы можете использовать expand для циклического перемещения по вашему массиву функций.

expand сразу выдаст значение текущей наблюдаемой величины, а затем отобразит следующую наблюдаемую величину с ранее выделенным значением в качестве входных данных. Это будет продолжаться бесконечно, поэтому вам нужно остановить цикл, сопоставив его с EMPTY.

import { of, EMPTY } from 'rxjs';
import { expand, skip } from 'rxjs/operators';

// initialValue is the value passed to the first function
of(initialValue).pipe(
  expand((value, i) => i < fns.length ? fns[i](value) : EMPTY),
  skip(1) // don't emit the initialValue
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...