merge 和 mergeAll 有什么区别?
What is the difference between merge and mergeAll?
merge 和 mergeAll 有什么区别?他们对我来说似乎是一样的:
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeAll
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-merge
merge 是一种静态创建方法,可以扁平化一组可观察对象。
根据文档
Flattens multiple Observables together by blending their values into one Observable.
简单地说,它将采用一组可观察对象,并将它们压平在一个内,因此每当任何可观察对象发出一个值时,输出都会发出一个值。
mergeAll 然而不同的是,根据文档
,它是一个与高阶可观察对象(发出可观察对象的可观察对象)一起工作的实例方法
Converts a higher-order Observable into a first-order Observable which concurrently delivers all values that are emitted on the inner Observables.
我认为总结起来,但是 mergeAll 可能会造成混淆,所以让我们看看 rxjs 文档提供的这个例子
import { fromEvent, interval } from 'rxjs';
import { take, map, mergeAll } from 'rxjs/operators';
const higherOrder = fromEvent(document, 'click').pipe(
map((ev) => interval(1000).pipe(take(10))),
);
const firstOrder = higherOrder.pipe(mergeAll(2));
firstOrder.subscribe(x => console.log(x));
你有一个 document click observable(高阶),它 return 一个间隔 observable(内部 observable)每秒发出一个值,它将在 10 个间隔发出后完成,这意味着每次你点击文档,一个新的间隔将被 returned,这里合并所有进来,它将订阅这些间隔 returned 由高阶可观察量,并将它们展平为一个可观察量,一阶observable,参数2,是限制一次并发2个区间,所以如果你点击3次,只有2个会运行,但是由于这2个区间会在10秒后完成,那么你可以再次点击并mergeAll 将订阅新的时间间隔。
merge
和 mergeAll
都继承了 来自 mergeMap
!
合并所有
mergeAll
与使用 身份函数调用 mergeMap
相同 (const identity = x => x
)
mergeAll() === mergeMap(obs$ => obs$)
示例:
of(a$, b$, c$)
.pipe(
mergeAll(),
)
.subscribe()
// Same as
of(a$, b$, c$)
.pipe(
mergeMap(obs$ => obs$)
)
.subscribe()
两者都将订阅传入的可观察对象(a$
、b$
和 c$
)并将它们的值传递给数据消费者。因此,a$
、b$
和 c$
被认为是 内部可观察值 。
合并
有了上一节的知识,理解merge
应该不难。
merge(a$, b$, c$).subscribe()
与
基本相同
const observables = [a$, b$, c$];
new Observable(subscriber => {
for (let i = 0; i < observables.length; i++) {
subscriber.next(observables[i]);
}
subscriber.complete();
}).pipe(
mergeAll()
).subscribe();
merge 和 mergeAll 有什么区别?他们对我来说似乎是一样的: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeAll http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-merge
merge 是一种静态创建方法,可以扁平化一组可观察对象。 根据文档
Flattens multiple Observables together by blending their values into one Observable.
简单地说,它将采用一组可观察对象,并将它们压平在一个内,因此每当任何可观察对象发出一个值时,输出都会发出一个值。
mergeAll 然而不同的是,根据文档
,它是一个与高阶可观察对象(发出可观察对象的可观察对象)一起工作的实例方法Converts a higher-order Observable into a first-order Observable which concurrently delivers all values that are emitted on the inner Observables.
我认为总结起来,但是 mergeAll 可能会造成混淆,所以让我们看看 rxjs 文档提供的这个例子
import { fromEvent, interval } from 'rxjs';
import { take, map, mergeAll } from 'rxjs/operators';
const higherOrder = fromEvent(document, 'click').pipe(
map((ev) => interval(1000).pipe(take(10))),
);
const firstOrder = higherOrder.pipe(mergeAll(2));
firstOrder.subscribe(x => console.log(x));
你有一个 document click observable(高阶),它 return 一个间隔 observable(内部 observable)每秒发出一个值,它将在 10 个间隔发出后完成,这意味着每次你点击文档,一个新的间隔将被 returned,这里合并所有进来,它将订阅这些间隔 returned 由高阶可观察量,并将它们展平为一个可观察量,一阶observable,参数2,是限制一次并发2个区间,所以如果你点击3次,只有2个会运行,但是由于这2个区间会在10秒后完成,那么你可以再次点击并mergeAll 将订阅新的时间间隔。
merge
和 mergeAll
都继承了 来自 mergeMap
!
合并所有
mergeAll
与使用 身份函数调用 mergeMap
相同 (const identity = x => x
)
mergeAll() === mergeMap(obs$ => obs$)
示例:
of(a$, b$, c$)
.pipe(
mergeAll(),
)
.subscribe()
// Same as
of(a$, b$, c$)
.pipe(
mergeMap(obs$ => obs$)
)
.subscribe()
两者都将订阅传入的可观察对象(a$
、b$
和 c$
)并将它们的值传递给数据消费者。因此,a$
、b$
和 c$
被认为是 内部可观察值 。
合并
有了上一节的知识,理解merge
应该不难。
merge(a$, b$, c$).subscribe()
与
const observables = [a$, b$, c$];
new Observable(subscriber => {
for (let i = 0; i < observables.length; i++) {
subscriber.next(observables[i]);
}
subscriber.complete();
}).pipe(
mergeAll()
).subscribe();