Spec-Zone.ru › ReactiveX

CombineLatest

когда элемент излучается любым из двух наблюдаемых, объедините последний излученный элемент каждого наблюдаемого через указанную функцию и излучайте элементы на основе результатов этой функции
Открыть интерактивную диаграмму на rxmarbles.com

Оператор CombineLatest ведет себя аналогично оператору Zip, но в то время как Zip излучает элементы только тогда, когда каждый из наблюдаемых источников излучил ранее не скомбинированный элемент, CombineLatest излучает элемент всякий раз, когда любой из наблюдаемых источников излучает элемент (при условии, что каждый из наблюдаемых источников излучил по крайней мере один элемент). Когда любой из наблюдаемых источников излучает элемент, CombineLatest объединяет самые последние излученные элементы каждого из других наблюдаемых источников, используя предоставленную вами функцию, и излучает значение, возвращаемое этой функцией.

См. также

  • Zip
  • Введение в Rx: CombineLatest
  • RxMarbles: combineLatest
  • RxMarbles: withLatestFrom
  • 101 Примеры Rx: CombineLatest — Параллельное выполнение
  • 101 Примеры Rx: CombineLatest

Информация, специфичная для языка

RxGroovy combineLatest withLatestFrom

combineLatest

RxGroovy реализует этот оператор как combineLatest. Он может принимать от двух до девяти наблюдаемых (а также функцию объединения) в качестве параметров или один List наблюдаемых (а также функцию объединения). По умолчанию он не работает с каким-либо конкретным Планировщиком.

  • Javadoc: combineLatest(List,FuncN)
  • Javadoc: combineLatest(Observable,Observable,Func2) (есть также версии, которые принимают до девяти наблюдаемых)
withLatestFrom

На стадии разработки, но не входит в релиз 1.0, находится оператор withLatestFrom. Он похож на combineLatest, но излучает элементы только тогда, когда единственный исходный наблюдаемый излучает элемент (а не когда любой из наблюдаемых, переданных оператору, излучает элемент, как combineLatest).

RxJava 1․x combineLatest withLatestFrom

combineLatest

RxJava реализует этот оператор как combineLatest. Он может принимать от двух до девяти наблюдаемых (а также функцию объединения) в качестве параметров или один List наблюдаемых (а также функцию объединения). По умолчанию он не работает с каким-либо конкретным Планировщиком.

  • Javadoc: combineLatest(List,FuncN)
  • Javadoc: combineLatest(Observable,Observable,Func2) (есть также версии, которые принимают до девяти наблюдаемых)
withLatestFrom

На стадии разработки, но не входит в релиз 1.0, находится оператор withLatestFrom. Он похож на combineLatest, но излучает элементы только тогда, когда единственный исходный наблюдаемый излучает элемент (а не когда любой из наблюдаемых, переданных оператору, излучает элемент, как combineLatest).

RxJS combineLatest withLatestFrom

combineLatest

RxJS реализует этот оператор как combineLatest. Он может принимать переменное количество отдельных наблюдаемых (а также функцию объединения) в качестве параметров или один 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, но излучает элементы только тогда, когда единственный исходный наблюдаемый излучает элемент (а не когда любой из наблюдаемых, переданных оператору, излучает элемент, как combineLatest).

Пример кода

/* 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 withLatestFrom

RxPHP реализует этот оператор как combineLatest.

Объединяет указанные наблюдаемые последовательности в одну наблюдаемую последовательность, используя функцию селектора всякий раз, когда любой из наблюдаемых последовательностей производит элемент. Наблюдаемые должны быть массивом. Если функция селектора результата опущена, будет возвращен массив элементов.

Пример кода

//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.

Объединяет указанные наблюдаемые последовательности в одну наблюдаемую последовательность, используя функцию селектора только тогда, когда (первый) исходный наблюдаемый последовательность производит элемент.

Пример кода

//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!

© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/combinelatest.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API