Skip to content

WithLatestFrom

1. 概要

WithLatestFrom は、メインソース(第 1 の Observable)が新しい値を発行したときに、もう一方の Observable の最新値と組み合わせて結果を生成するオペレーターです。

CombineLatest と異なり、サブソース(第 2 の Observable)が新しい値を発行しても結果は生成されません。メインソースの発行タイミングのみが結果の発行を駆動します。サブソースがまだ値を発行していない場合、メインソースの値は破棄されます。

2. シグネチャ

メインソースの発行時に他方の最新値と結合する

csharp
public static Observable<TResult> WithLatestFrom<TFirst, TSecond, TResult>(
    this Observable<TFirst> first,
    Observable<TSecond> second,
    Func<TFirst, TSecond, TResult> resultSelector)

first(メインソース)が値を発行するたびに、second の最新値とともに resultSelector に渡して結果を生成します。second がまだ値を発行していない場合、first の値は無視されます。

csharp
source.WithLatestFrom(latest, (x, y) => x + y)

3. マーブルダイアグラム

WithLatestFrom のマーブルダイアグラム

メインソースが値を発行するたびに、サブソースの最新値と組み合わせた結果が下流へ流れます。サブソースだけが発行しても結果は生成されません。

4. サンプルコード

csharp
using R3;

var main = new Subject<string>();
var sub = new Subject<int>();

main.WithLatestFrom(sub, (str, num) => $"{str}:{num}")
    .Subscribe(x => Console.WriteLine(x));

sub.OnNext(1);
main.OnNext("A");     // 出力: A:1
sub.OnNext(2);        // 出力なし(サブソースの発行のみ)
sub.OnNext(3);        // 出力なし
main.OnNext("B");     // 出力: B:3(サブソースの最新値 3 を使用)
main.OnNext("C");     // 出力: C:3

5. 補足

CombineLatest との違い

CombineLatest は、いずれかのソースが値を発行するたびに結果を生成します。WithLatestFrom はメインソースの発行タイミングのみで結果を生成するため、サブソースの高頻度な発行に影響されません。

特性CombineLatestWithLatestFrom
発行トリガーいずれかのソースメインソースのみ
サブソースの発行で結果生成するしない
典型的な用途双方向バインディングメインに補助情報を付加