CombineLatest

当两个 Observable 中的任何一个发出一个项目时,通过指定的函数组合每个 Observable 发出的最新项目,并根据该函数的结果发出项目。

CombineLatest 运算符的行为类似于 Zip,但 Zip 仅在每个压缩的源 Observable 都发出一个之前未压缩的项目时才会发出项目,而 CombineLatest 则是在任何源 Observable 发出一个项目时就会发出项目(只要每个源 Observable 至少发出过一个项目)。当任何一个源 Observable 发出一个项目时,CombineLatest 会使用您提供的函数组合来自每个其他源 Observable 的最新发出的项目,并发出该函数的返回值。

另请参阅

特定语言信息

待定

combineLatest

RxGroovy 将此运算符实现为 combineLatest。它可以接受两个到九个 Observable(以及组合函数)作为参数,或者一个包含 Observable 的 List(以及组合函数)。它默认情况下不会在任何特定 Scheduler 上运行。

withLatestFrom

正在开发中,但不是 1.0 版本的一部分,是 withLatestFrom 运算符。它类似于 combineLatest,但只有在单个源 Observable 发出一个项目时才会发出项目(而不是像 combineLatest 那样,在传递给运算符的任何 Observable 发出项目时才会发出项目)。

combineLatest

RxJava 将此运算符实现为 combineLatest。它可以接受两个到九个 Observable(以及组合函数)作为参数,或者一个包含 Observable 的 List(以及组合函数)。它默认情况下不会在任何特定 Scheduler 上运行。

withLatestFrom

正在开发中,但不是 1.0 版本的一部分,是 withLatestFrom 运算符。它类似于 combineLatest,但只有在单个源 Observable 发出一个项目时才会发出项目(而不是像 combineLatest 那样,在传递给运算符的任何 Observable 发出项目时才会发出项目)。

combineLatest

RxJS 将此运算符实现为 combineLatest。它可以接受可变数量的单个 Observable(以及组合函数)作为参数,或者一个包含 Observable 的 Array(以及组合函数)。

示例代码

/* Have staggering intervals */
var source1 = Rx.Observable.interval(100)
    .map(function (i) { return 'First: ' + i; });

var source2 = Rx.Observable.interval(150)
    .map(function (i) { return 'Second: ' + i; });

// Combine latest of source1 and source2 whenever either gives a value
var source = source1.combineLatest(
        source2,
        function (s1, s2) { return s1 + ', ' + s2; }
    ).take(4);

var subscription = source.subscribe(
    function (x) {
        console.log('Next: ' + x.toString());
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
    });
Next: First: 0, Second: 0
Next: First: 1, Second: 0
Next: First: 1, Second: 1
Next: First: 2, Second: 1
Completed
withLatestFrom

RxJS 还拥有一个 withLatestFrom 运算符。它类似于 combineLatest,但只有在单个源 Observable 发出一个项目时才会发出项目(而不是像 combineLatest 那样,在传递给运算符的任何 Observable 发出项目时才会发出项目)。

示例代码

/* Have staggering intervals */
var source1 = Rx.Observable.interval(140)
    .map(function (i) { return 'First: ' + i; });

var source2 = Rx.Observable.interval(50)
    .map(function (i) { return 'Second: ' + i; });

// When source1 emits a value, combine it with the latest emission from source2.
var source = source1.withLatestFrom(
    source2,
    function (s1, s2) { return s1 + ', ' + s2; }
).take(4);

var subscription = source.subscribe(
    function (x) {
        console.log('Next: ' + x.toString());
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
    });
Next: First: 0, Second: 1
Next: First: 1, Second: 4
Next: First: 2, Second: 7
Next: First: 3, Second: 10
Completed

这两个运算符在以下每个发行版中都可用

  • rx.js
  • rx.compat.js
  • rx.lite.js
  • rx.lite.compat.js

RxPHP 将此运算符实现为 combineLatest

使用选择器函数将指定的 Observable 序列合并为一个 Observable 序列,只要任何一个 Observable 序列生成一个元素就会调用该函数。Observable 必须是一个数组。如果省略结果选择器,则将产生包含元素的列表。

示例代码

//from https://github.com/ReactiveX/RxPHP/blob/master/demo/combineLatest/combineLatest.php

/* Have staggering intervals */
$source1 = \Rx\Observable::interval(100);
$source2 = \Rx\Observable::interval(120);

$source = $source1->combineLatest([$source2], function ($value1, $value2) {
    return "First: {$value1}, Second: {$value2}";
})->take(4);

$subscription = $source->subscribe($stdoutObserver);

   
Next value: First: 0, Second: 0
Next value: First: 1, Second: 0
Next value: First: 1, Second: 1
Next value: First: 2, Second: 1
Complete!
    

RxPHP 还拥有一个 withLatestFrom 运算符。

使用选择器函数将指定的 Observable 序列合并为一个 Observable 序列,只有在(第一个)源 Observable 序列生成一个元素时才会调用该函数。

示例代码

//from https://github.com/ReactiveX/RxPHP/blob/master/demo/withLatestFrom/withLatestFrom.php

/* Have staggering intervals */
$source1 = \Rx\Observable::interval(140)
    ->map(function ($i) {
        return 'First: ' . $i;
    });
$source2 = \Rx\Observable::interval(50)
    ->map(function ($i) {
        return 'Second: ' . $i;
    });

$source3 = \Rx\Observable::interval(100)
    ->map(function ($i) {
        return 'Third: ' . $i;
    });

$source = $source1->withLatestFrom([$source2, $source3], function ($value1, $value2, $value3) {
    return $value1 . ', ' . $value2 . ', ' . $value3;
})->take(4);

$source->subscribe($stdoutObserver);

   
Next value: First: 0, Second: 1, Third: 0
Next value: First: 1, Second: 4, Third: 1
Next value: First: 2, Second: 7, Third: 3
Next value: First: 3, Second: 10, Third: 4
Complete!