Преобразовать массив наблюдаемых наблюдаемых в массив наблюдаемых rxjs - PullRequest
0 голосов
/ 19 марта 2020

Чтобы упростить задачу, я использовал числа и строки здесь. Код:

const numbers$:Observable<number[]> = of([1,2,3]);
const strings: string[] = ["a","b"];

function getStrings(): Observable<string>[]{
   return numbers$.pipe( 
     map((numbers: number[]) => {
       const strings$: Observable<string>[] =  strings.map(s => of(s));
       return strings$;
     }),
  )
}

getStrings().subscribe(x => console.log(x))

Ошибка, которую я получаю: Type 'Observable<Observable<string>[]>' is missing the following properties from type 'Observable<string>[] Как я могу получить Observable<string>[] из функции getStrings? Я пытался использовать flatMap, switchMap, но не смог получить идеальную комбинацию.

Stackblitz

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Вам нужно будет использовать mergeMap() и forkJoin():

function getStrings(): Observable<string[]>{
   return numbers$.pipe( 
     mergeMap((numbers: number[]) => {
       const strings$: Observable<string>[] =  strings.map(s => of(s));
       return forkJoin(strings$);
     }),
  )
}

getStrings().subscribe(x => console.log(x))

https://stackblitz.com/edit/rxjs-dzvsbh?file=index.ts

0 голосов
/ 19 марта 2020

Итак, насколько я понимаю, вы хотите "сжать" два списка вместе, через наблюдаемые?

Я могу предложить вам этот


    const numbers$: Observable<number[]> = of([1, 2, 3]);
    const strings$: Observable<string[]> = of(['a', 'b']);

    const combined$: Observable<any> = zip(numbers$, strings$)
      .pipe(
        map(([numbers, strings]) =>
          numbers.length > strings.length ?
            numbers.map((value, index) => [value, strings[index]]) :
            strings.map((value, index) => [numbers[index], value]))
      );

    combined$.subscribe(value => console.log(value));

Это будет записывать: [[1, "a"], [2, "b"], [3, null]]

...