mergeAll如何运作?

时间:2018-01-24 13:22:24

标签: javascript rxjs

我想知道mergeAll如何运作并创建示例:

const clicks = Rx.Observable.interval(4000).map(()=> "first");
const higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).map(() => "inner").take(10));
const firstOrder = higherOrder.mergeAll();
firstOrder.subscribe(x => console.log(x));

输出总是innerfirst从未输出。在调用mergeAll()之后,clicks观察点不再相关了吗?

更多示例:

const input = document.getElementById("window");

const clicks = Rx.Observable.fromEvent(input, 'keyup').map(() => "Hello");
const interval = Rx.Observable.interval(4000);
const result = clicks.window(interval)
    .map(win => {
        return win.take(1);
    })
    .mergeAll(); // flatten the Observable-of-Observables
result.subscribe(x => console.log("Result " + x));

在订阅上,我从外部可观察的“结果Hello”得到了结果,而不是内部的observable。在这种情况下,mergeAll扮演什么样的角色? 为什么win变量是实例observable而不是Hello

2 个答案:

答案 0 :(得分:5)

  

调用mergeAll()后,点击可观察性不再相关?

正确。您将每个单击的点击映射到"inner"个事件流。 mergeAll只是将这些流合并在一起。点击事件仅在特定合并流开始的时间点非常微弱地存在于此结果流中。这种方式变得更加清晰:

const clicks$ = Rx.Observable.interval(1000);
const higherOrder$ = clicks$.map(click => Rx.Observable.interval(500)
  .map(counter => `${click}–${counter}`)
);
higherOrder$.mergeAll().subscribe(console.log);

documentation及其大理石图也可能有助于您理解:

enter image description here

答案 1 :(得分:1)

你应该使用switchMap。

firstOrder.switchMap(x => console.log(x)).subscribe( value => console.log(value));

result.switchMap(x => console.log("Result " + x)).subscribe( value => console.log(value));

switch需要一个Observables的流,当它获得一个Observable推送到它的输入流时,它取消订阅任何先前的Observable并订阅新的Observable,然后将该Observable中的任何值发送到它的输出流。< / p>