rxjs 6 - Observable ‹Массив (объекты)› в Observable ‹Objects›

У меня есть наблюдаемое, которое испускает массив объектов. Какие операторы с конвейером мне нужно использовать, чтобы преобразовать его в Observable, чтобы я мог воздействовать на каждый объект?

Что мне нужно сделать с obs $, чтобы он излучал как obs2 $?

const obs$ = of([{ opponent: 'Walton', team: 'varsity', gametime: new Date() },
{ opponent: 'Scott', team: 'varsity', gametime: new Date() },
{ opponent: 'Dixie', team: 'varsity', gametime: new Date() },
{ opponent: 'Highlands', team: 'freshmen', gametime: new Date() }])
  .pipe(
    tap(console.log)
  );

obs$.subscribe(a =>
  console.log(a)
);

const obs2$ = of({ opponent: 'Walton', team: 'varsity', gametime: new Date() },
  { opponent: 'Scott', team: 'varsity', gametime: new Date() },
  { opponent: 'Dixie', team: 'varsity', gametime: new Date() },
  { opponent: 'Highlands', team: 'freshmen', gametime: new Date() })
  .pipe(
    tap(console.log)
  );

obs2$.subscribe(a =>
  console.log(a)
);

person user1247395    schedule 30.05.2018    source источник


Ответы (3)


Вам нужно mergeAll:

of([2, 3, 4]).pipe(
  mergeAll()
).subscribe(v => console.log(v));
// outputs 2, 3, 4

Если вы используете from, он тоже будет работать:

from([2, 3, 4])
  .subscribe(v => console.log(v));
// outputs 2, 3, 4
person Fabricio    schedule 30.05.2018

Просто используйте from наблюдаемое:

import {Observable, from } from 'rxjs';
// Write TypeScript code!

const myDatas = [{ opponent: 'Walton', team: 'varsity', gametime: new Date() },
{ opponent: 'Scott', team: 'varsity', gametime: new Date() },
{ opponent: 'Dixie', team: 'varsity', gametime: new Date() },
{ opponent: 'Highlands', team: 'freshmen', gametime: new Date() }];

from(myDatas).subscribe(e => console.log(e));

живой образец

person Yanis-git    schedule 30.05.2018

Спасибо Вам за Ваш вопрос! Нет, это все еще актуально, но я хочу ответить. Я думаю, что исходный Observable изменить нельзя. Итак, мы хотим преобразовать массив в объект Observable. Как уже упоминалось, здесь может помочь оператор from(), потому что он принимает массив значений и выдает их как значения наблюдаемого.

Итак, единовременный способ решить эту проблему - создать пайп, pipe(switchMap(from)) он нам поможет. Но я хотел бы создать повторно используемое решение для будущих разработчиков. Что-то вроде оператора toStream() с таким же кодом внутри. Вы, конечно, можете изменить имя!

Вот несколько ссылок о моих решениях:

P.S. Пожалуйста, оставьте отзыв об ответе, чтобы мы могли улучшить сообщество и мотивировать других помогать нам. Хорошего дня. Надеюсь, этот ответ был полезен.

person Andrii Zelenskyi    schedule 03.11.2019