Skip to content

ReturnOnCompleted

1. 概要

ReturnOnCompleted は、値を一切発行せずに、指定した Result で即座に(または遅延して)完了するファクトリメソッドです。

Result は成功(正常完了)またはエラー(異常完了)を表現できるため、完了通知やエラー通知だけを送りたい場合に使用します。データを伴わないシグナリングに適しています。

2. シグネチャ

即座に完了

csharp
public static Observable<T> ReturnOnCompleted<T>(Result result)

購読されると直ちに、指定した Result で完了します。値は発行されません。

csharp
// 正常完了
Observable.ReturnOnCompleted<string>(Result.Success)

// エラーで完了
Observable.ReturnOnCompleted<string>(Result.Failure(new Exception("error")))

TimeProvider 指定

csharp
public static Observable<T> ReturnOnCompleted<T>(Result result, TimeProvider timeProvider)

TimeProvider を使って非同期的に完了通知を送ります。

csharp
Observable.ReturnOnCompleted<int>(Result.Success, TimeProvider.System)

遅延付き

csharp
public static Observable<T> ReturnOnCompleted<T>(Result result, TimeSpan dueTime, TimeProvider timeProvider)

指定した時間が経過した後に完了通知を送ります。

csharp
// 2 秒後にエラーで完了
Observable.ReturnOnCompleted<int>(
    Result.Failure(new TimeoutException()),
    TimeSpan.FromSeconds(2),
    TimeProvider.System)

オーバーロードの使い分け

overload使う場面
ReturnOnCompleted<T>(Result)即座に完了またはエラーを通知する
ReturnOnCompleted<T>(Result, TimeProvider)非同期的に完了通知を送る
ReturnOnCompleted<T>(Result, TimeSpan, TimeProvider)指定時間だけ遅延してから完了通知を送る

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

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

ReturnOnCompleted は値を一切発行しません。購読後、即座に(または指定時間の経過後に)完了通知のみを送ります。Result が成功の場合は正常完了、失敗の場合はエラー通知となります。

4. サンプルコード

csharp
using R3;

// 正常完了のみ通知
Observable.ReturnOnCompleted<string>(Result.Success)
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),          // 呼ばれない
        r => Console.WriteLine($"完了: {r}"));
// 出力: 完了: Success

// エラーで完了
Observable.ReturnOnCompleted<int>(Result.Failure(new InvalidOperationException("無効な操作")))
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),          // 呼ばれない
        r => Console.WriteLine($"完了: {r}"));
// 出力: 完了: Failure(System.InvalidOperationException: 無効な操作)

// 遅延付きで正常完了
Observable.ReturnOnCompleted<string>(
    Result.Success,
    TimeSpan.FromSeconds(1),
    TimeProvider.System)
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),          // 呼ばれない
        r => Console.WriteLine($"完了: {r}"));
// 出力(1 秒後): 完了: Success