2017-03-14 40 views
0

次々と実行したいRx Completablesのチェーンがあります。私はconcat()を使用しています。私はそれらをすべて同時に開始したくないからです。観測可能なチェーンを終了してエラーが発生した場合

view.welcome_message_edittext.verifyNotEmpty(getString(R.string.enter_your_email_address)) 
    .concatWith(view.welcome_message_edittext.verifyEmailAddress()) 
    .concatWith(sendMessageToBot()) 
    .subscribe({ 
     // The user has successfully entered data into the edittext, entered an email into the edittext, and sent message to bot. 
    }, { error -> }) 

上記のコードは、ユーザーがのEditTextにテキストを入力しました。それが本当であれば、ユーザーはのEditTextに電子メールを入力した主張アサート」、これを言っている。これらの両方に該当する場合は、送信しますメッセージをボットに送ります。 "ユーザーがEditTextにテキストを入力しても電子メールではない場合は、Completableのチェーンが壊れてonError()が呼び出されることが予想されます。

enter image description here

これは私が^^^起こるしたいものです。 Completablesの任意のは、(ユーザーが空のEditTextを離れるか、メールアドレスを入力していない場合verifyNotEmpty()verifyEmailAddress()のようにしてください)onError()を呼び出すと、私はチェーン全体が終了し.subscribe()onError()関数を呼び出すことを期待しています。

しかし、.concat()このためにドキュメントを見て、それを実際の行動である:onErrorが呼び出されたときに

enter image description here

concat()は、単純に次のCompletable上に移動します。チェーンは続く。

だから私の質問、私はCompletablesのいずれかがonError()を呼び出すときにチェーンを断ち切るために使用するために何が必要ですか?

+0

私は最後のスクリーンショットのいずれかのエラーイベントが表示されません。エラーイベントには、タイムラインに十字マークが付けられます。だから、私が '' CONCAT()を使用しています@Buckstabueその場合 – Buckstabue

+0

で連結を使用しても大丈夫でなければなりません。上記のコードスニペットは、私のアプリで私の実際のコードスニペットです。コードを実行するときに、EditTextを空白のままにしておくと、 'verifyEmailAddress()'と 'sendMessageToBot()'関数の両方が後で呼び出されます。 'subscribe()'の 'onError()'は呼び出されますが、 'verifyEmailAddress()'は 'verifyEnterEmpty()'が 'onError()'を呼び出した後に呼び出されません。 – levibostian

+0

あなたは何を意味するのか分かりません。すべてのエラーを収集しますか?もしそうなら、mergeDelayError()オペレーターを見てください。 – Buckstabue

答えて

1

@Buckstabueのおかげでこの問題をデバッグするのに役立ちました。彼のコメント:

私は推測させてください。それは、メソッドverifyEmailAddress()が呼び出されていることは絶対に普通です。私は、オブザーバブルの外でビジネスロジックをやっていると思います。あなたは、観察の内側にそのロジックを置くことができ、それはObservable.just(getMyInteger())とObservable.fromCallableの違いに似ていレイジー計算されます(() - > getMyInteger())。第二の場合にgetMyInteger()はいい加減最初のものは直ちに

呼ばれながら、加入後に呼び出される私のコードに戻って、私のverifyEmailAddress()sendMessageToBot()機能見:

private fun sendMessageToBot(): Completable { 
    insertChatMessageIntoConversation(ChatMessage(view!!. welcome_message_edittext.text.toString())) 
    return Completable.complete() 
} 

fun EditText.verifyEmailAddress(): Completable { 
    if (!android.util.Patterns.EMAIL_ADDRESS.matcher(text.trim()).matches()) { 
     return Completable.error(RuntimeException("Enter a valid email")) 
    } else { 
     return Completable.complete() 
    } 
} 

のロジックをCompletableブロックの内には、の機能がありませんでした。私は受信者の行動は、それが各Completableを実行し、それらが完了するか、次のCompleteable上に移動する前に、完全にエラーに待っていたということだと思ったので、私は、コードを書いたとき、これは重要だっと思いませんでした。したがって、sendMessageToBot()verifyEmailAddress()を完全にスキップします。そうではありません。

これは動作します:

fun EditText.verifyEmailAddress(): Completable { 
    return Completable.fromCallable({ 
     if (!android.util.Patterns.EMAIL_ADDRESS.matcher(text.trim()).matches()) { 
      val errorMessage = context.getString(R.string.enter_email_address) 
      error = errorMessage 
      throw RuntimeException(errorMessage) 
     } 
    }) 
} 

private fun sendMessageToBot(): Completable { 
    return Completable.fromCallable { 
     insertChatMessageIntoConversation(sage(view!!. welcome_message_edittext.text.toString())) 
    } 
} 
関連する問題