rx js: каков наилучший способ динамического добавления значений в наблюдаемый поток? - PullRequest
0 голосов
/ 16 апреля 2020

В рамках обучения rx js я использовал методы создания, начиная с интервала et c. чтобы проверить газ и дебут, и т. д. c я создавал потоки с использованием fromevent.

теперь у меня есть реальный вариант использования, и мне нужно динамически добавлять значения в пустой наблюдаемый поток. Я не могу найти какие-либо примеры того, как лучше всего сделать это НЕ используя методы создания выше. В настоящее время я использую BehaviourSubject для динамического добавления элементов в поток, используя next (). Является ли это лучшим / предпочтительным способом динамического добавления новых элементов в поток?

например,

import { BehaviorSubject, timer } from 'rxjs';
import { tap, mapTo, concatMap, } from 'rxjs/operators';

const subject = new BehaviorSubject(1);
const example = subject.pipe(
  concatMap(ev => timer(200).pipe(mapTo(ev))),
  tap((ev) => console.log(ev))
)
example.subscribe();

// add a flurry of values dynamically
subject.next(2);
subject.next(3);
subject.next(4);

// some time later add some more
setTimeout(function(){ 
  subject.next(5);
  subject.next(6);
  subject.next(7);
}, 5000);

https://stackblitz.com/edit/rxjs-behaviorsubject-simpleexample-gyrtw8?file=index.ts

Спасибо

1 Ответ

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

Если у вас есть собственный пользовательский лог c для добавления значений, которые должны быть переданы в Observable, вы можете создать свой собственный (вместо использования fromEvent, of, from, ...):


const myObservable = new Observable(subscriber => {
  subscriber.next(1);
  subscriber.next(2);
  subscriber.next(3);

  setTimeout(() => {
    subscriber.next(4);
    subscriber.next(5);


    setTimeout(() => {
       subscriber.next(6);
    }, 2000);
  }, 1000);
});

Однако, Функции создания rx js должны покрывать 99% ваших потребностей. Вышеприведенный код также можно записать так:

concat(
  of(1,2,3),
  of(4,5).pipe(
    delay(1000)
  ),
  of(6).pipe(
    delay(2000)
  )
)

UPD: О предметах

Субъект также является наблюдаемым, поэтому в вашем случае использование Субъекта применимо, но может быть не лучшим вариант. Идея субъекта заключается в том, что может быть более одного подписчика (тот, кто использует значения от субъекта), но я не уверен, что это ваш случай (кстати - вы можете предоставить свой реальный пример, чтобы помочь нам понять чего ты хочешь добиться)

...