質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Rx.NET

Rx.NETは、リアクティブプログラミングが可能なライブラリの一つ。.NET Framework向けReactive Extensionsライブラリです。マイクロソフト社が初めてRxライブラリとして提供し、ここから多くの言語にRxが移植されるようになりました。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

Q&A

受付中

System.ReactiveでOnComplete/OnError前に確実に実行されるObservableを挟みたい

Tak1016
Tak1016

総合スコア1408

Rx.NET

Rx.NETは、リアクティブプログラミングが可能なライブラリの一つ。.NET Framework向けReactive Extensionsライブラリです。マイクロソフト社が初めてRxライブラリとして提供し、ここから多くの言語にRxが移植されるようになりました。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

0回答

0グッド

2クリップ

245閲覧

投稿2018/06/29 10:48

.NET 3.5 にて
Install-Package Rx-Main -Version 1.0.11226
System.Reactive を利用しています。

A,B,C,ZをそれぞれCold Observableとしたときに
A -> B-> C のObservableチェインで成否に関わらず、最後に必ずZの実行を保証したい。
Zは非同期で Zの完了を待って SubsribeのOnComplete/OnErrorを処理したい。

A .SelectMany( n => B) .SelectMany( n => C) .?????(()=>{ //後始末を実行した後で OnComplete/OnErrorを処理したい }) .Subscribe( n => {}, error => {}, () =>{ })

後始末処理はFinallyを使った場合、OnCompleteとOnErrorの後に処理されてしまいます。
どういう書き方ができますでしょうか。

Subscribeをネストさせた書き方は避けたいです。
###避けたいコード

Observable.Crate( observer => { A .SelectMany( n => B) .SelectMany( n => C) .Finally(()=>{ z.Finally(()=> { Subscribeのキャッシュで observer.OnNext/OnErrorを発火 } }) .Subscribe( n => { //nをキャッシュ }, error => { //errorをキャッシュ }, () =>{ }); return Disposable.Empty; }) .Subscribe( n => {}, error => {}, () =>{ });

###Finallyを使いたくない理由
Subscribeにて、どういう処理がされるのか分からず(ShowDialogなど)、後始末が遅れてしまうのを避けたい

###ネストしたくない理由
単純にかっこ悪いので。
Observableを繋いで新しいObservableを生成することがRxの醍醐味で
Subscribeにて1回イベントストリームが流れるのがColdなので、
Subscribeを何回も内部で行うのは、Rxの思想に反すると思うから。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Rx.NET

Rx.NETは、リアクティブプログラミングが可能なライブラリの一つ。.NET Framework向けReactive Extensionsライブラリです。マイクロソフト社が初めてRxライブラリとして提供し、ここから多くの言語にRxが移植されるようになりました。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。