将新的rxjs可观察者合并到现有的订阅可观察者中

时间:2019-04-15 20:05:16

标签: rxjs

我有一个已订阅的rxjs observable:

const o = new rxjs.Subject();
o.subscribe( (v) => console.log("value: " + v);

由于某些无关的事件,例如用户单击按钮时,我需要从服务器中获取数据,并将该数据放入现有的可观察的o中。使用axios,我有这样的东西:

const aPromise = axios.get("someurl...")

然后我执行以下操作:

const secondObservable = rxjs.of(aPromise)
                             .subscribe( (response) => o.next(response.data) )

我的问题是,是否有更好的方法可以将响应数据放入可能已经使用运算符的已订阅的现有数据中?

2 个答案:

答案 0 :(得分:1)

如果您知道需要原始流中的数据,并且可能通过单击按钮获得更新-那么我们将需要创建一个按钮单击流,例如

const btnClick$ = new rxjs.Subject();

onClick(){
  this.btnClick$.next(void 0);
}

然后,我们将使用switchMap将此btnClick$流转换为http-get请求流:

const request$ = btnClick$.pipe(
  // each click will be turned into a http-get
  switchMap(() => rxjs.of(axios.get("someurl...")))
)

我们已经准备就绪,可以通过单击按钮来使用来自服务器流和原始流的结果,以及来自服务器的可能的数据更新流。

// we'll take results both from original stream
// and our new possible source of data
merge(original$, request$).subscribe(data => {
  console.log(data);
})

这里有一个使用模拟的小应用程序:

const { fromEvent, of, merge } = rxjs;
const { map, delay, switchMap } = rxjs.operators;

// create a stream of btn clicks
const theButton = document.getElementById('the-btn');
const btnClicks$ = fromEvent(theButton, 'click');

console.log('Processing...');

// clicks turned into http-gets
const request$ = btnClicks$.pipe(
  switchMap(() => makeRequest())
);

// original source of data
const original$ = of('Please, click the button!').pipe(delay(500));

merge(original$, request$)
  .subscribe(data => {
    console.log(data);
  });

// mock for requests
function makeRequest(){
  return of(Date.now()).pipe(delay(500))
}
<script src="https://unpkg.com/rxjs@6.4.0/bundles/rxjs.umd.min.js"></script>

<button
  id="the-btn"
  >Click me!</button>

希望这会有所帮助

答案 1 :(得分:1)

您只需将通话结果直接传递给您的观察对象即可。

data = json.loads(data)

try:
    tweetStr = data['extended_tweet']['full_text']
except Exception as e:
    tweetStr = data['text']
private javax.swing.JList<String> list1;
list1.setFont(new java.awt.Font("Tahoma", 0, 24));

DefaultListModel listModel1 = new DefaultListModel();

String st="Working hard";
listModel1.addElement(r);

list1.setModel(listModel1);