Concat 操作符连接多个 Observable 的输出,使它们像单个 Observable 一样,第一个 Observable 发射的所有数据在第二个 Observable 发射任何数据之前都被发射(如果有超过两个 Observable,则依此类推)。
Concat 等待前面的 Observable 完成,然后再订阅你传递给它的每个额外的 Observable。注意,由于这一点,如果你尝试连接一个“热”Observable(即一个立即开始发射数据,并且在它被订阅之前就開始发射数据的 Observable),Concat 将看不到,因此也不会发射该 Observable 在所有之前的 Observable 完成且 Concat 订阅它之前发射的任何数据。
在一些 ReactiveX 实现中,还有一个 ConcatMap 操作符(也称为 concat_all
、concat_map
、concatMapObserver
、for
、forIn
/for_in
、mapcat
、selectConcat
或 selectConcatObserver
),它将源 Observable 发射的项目转换为相应的 Observable,然后按观察和转换它们的顺序连接这些 Observable 发射的项目。
The StartWith 操作符类似于 Concat,但它是前置而不是附加项目或项目发射,以源 Observable 发射的项目或项目发射。
The Merge 操作符也类似。它组合两个或多个 Observable 的发射,但可能会交织它们,而 Concat 永远不会交织多个 Observable 的发射。
concat
在 RxClojure 中,concat
将一些单个 Observable 连接在一起,按给定的顺序排列。
concat*
操作符将 Observable 发射的 Observable 连接在一起,按它们发射的顺序排列。
RxCpp 将此操作符实现为 concat
RxGroovy 将此操作符实现为 concat
。此操作符有变体,它们将两个到九个 Observable 作为参数,并按它们在参数列表中出现的顺序连接它们。还有一个变体,它将 Observable 的 Observable 作为参数,并按它们发射的顺序连接这些 Observable 的每一个。
odds = Observable.from([1, 3, 5, 7]); evens = Observable.from([2, 4, 6]); Observable.concat(odds, evens).subscribe( { println(it); }, // onNext { println("Error: " + it.getMessage()); }, // onError { println("Sequence complete"); } // onCompleted );
1 3 5 7 2 4 6 Sequence complete
concat(Observable<Observable>)
concat(Observable,Observable)
(还有最多接受九个 Observable 的版本)还有一个实例方法 concatWith
,使得 Observable.concat(a,b)
等价于 a.concatWith(b)
。
concatWith(Observable)
RxJava 将此操作符实现为 concat
。此操作符有变体,它们将两个到九个 Observable 作为参数,并按它们在参数列表中出现的顺序连接它们。还有一个变体,它将 Observable 的 Observable 作为参数,并按它们发射的顺序连接这些 Observable 的每一个。
concat(Observable<Observable>)
concat(Observable,Observable)
(还有最多接受九个 Observable 的版本)还有一个实例方法 concatWith
,使得 Observable.concat(a,b)
等价于 a.concatWith(b)
。
concatWith(Observable)
RxJS 将此操作符实现为 concat
和 concatAll
。
concat
将可变数量的 Observable(或 Promise)作为参数(或单个 Observable 或 Promise 数组),并按它们在参数列表(或数组)中出现的顺序连接它们。它既存在于 Observable 原型方法中,也存在于实例方法中。
concatAll
是一个实例方法,它对 Observable 的 Observable 进行操作,按它们发射的顺序连接这些 Observable 的每一个。
concat
和 concatAll
存在于以下每个发行版中
rx.js
rx.all.js
rx.all.compat.js
rx.compat.js
rx.lite.js
rx.lite.compat.js
RxKotlin 将此操作符实现为 concat
。此操作符有变体,它们将两个到九个 Observable 作为参数,并按它们在参数列表中出现的顺序连接它们。还有一个变体,它将 Observable 的 Observable 作为参数,并按它们发射的顺序连接这些 Observable 的每一个。
还有一个实例方法 concatWith
,使得 Observable.concat(a,b)
等价于 a.concatWith(b)
。
Rx.NET 将此操作符实现为 Concat
。它接受 Observable 的可枚举对象、Observable 的 Observable 或两个 Observable 作为参数,并按给定的顺序连接它们。
RxPHP 将此操作符实现为 concat
。
将一个 Observable 序列连接到源 Observable 的末尾。
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/concat/concat.php $source1 = \Rx\Observable::of(42); $source2 = \Rx\Observable::of(56); $source = \Rx\Observable::empty()->concat($source1)->concat($source2); $subscription = $source->subscribe($stdoutObserver);
Next value: 42 Next value: 56 Complete!
RxPHP 还有一个操作符 concatAll
。
将一个 Observable 序列序列连接成一个 Observable 序列。
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/concat/concatAll.php $source = Rx\Observable::range(0, 3) ->map(function ($x) { return \Rx\Observable::range($x, 3); }) ->concatAll(); $subscription = $source->subscribe($stdoutObserver);
Next value: 0 Next value: 1 Next value: 2 Next value: 1 Next value: 2 Next value: 3 Next value: 2 Next value: 3 Next value: 4 Complete!
在 RxPY 中,concat
将可变数量的 Observable 作为参数(或 Observable 数组),并按它们在参数列表(或数组)中出现的顺序连接它们。
concatAll
对 Observable 的 Observable 进行操作,按它们发射的顺序连接这些 Observable 的每一个。
在 Rx.rb 中,concat
操作符作为实例操作符对两个 Observable 进行操作,或作为类方法对 Observable 数组进行操作。
merge_all
操作符,尽管它的名字,但在 Rx.rb 中实际上表现得像 Concat 变体。它接受 Observable 的 Observable 作为参数,并连接这些 Observable 的发射。
RxScala 以两种方式实现了此操作符。有一个 concat
操作符,它接受 Observable 的 Observable 作为参数,然后按它们发射的顺序连接这些 Observable 的每一个。还有一个 ++
操作符,它将一个 Observable 连接到另一个。