mergeAll如何工作?

zer*_*ing 2 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));
Run Code Online (Sandbox Code Playgroud)

它始终输出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));
Run Code Online (Sandbox Code Playgroud)

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

Ing*_*ürk 6

调用mergeAll()之后,可观察到的点击不再相关了吗?

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

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

文档及其大理石图也可能帮助您理解:

在此处输入图片说明