我想知道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));
输出总是inner
和first
从未输出。在调用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
?
答案 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及其大理石图也可能有助于您理解:
答案 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>