Scalaドライバを使って、Play FrameworkとMongoDBに簡単なブログを書いています。 それは動作し、私は満足しているが、私のコードが十分ではないように感じる。 君たちが私のmongoサービス方法の一つであり、それはよりきれいにする方法があるかどうかを教えて、次のスニペット確認でした:MongoDB scala driver:Observerのコールバックを扱うとき、将来を返す最良の方法は何ですか?
def findByTitle(title:String)(implicit ec:ExecutionContext):Future[Option[Document]] = {
val collection = db.getCollection("items")
val results = collection.find(equal("title", title))
val contentPromise: Promise[Option[Document]] = Promise()
results.subscribe(new Observer[scala.Document] {
var empty: Boolean = true
override def onError(e: Throwable): Unit = println("Error")
override def onComplete(): Unit = {
if (empty) contentPromise.success(None)
}
override def onNext(result: scala.Document): Unit = {
empty = false
contentPromise.success(Some(result))
}
})
contentPromise.future
}
をそのそこにチャンスがあるかもしれないので、私はFuture[Option[Document]]
を返すことにしました提供されたタイトルでは何もありません。限り、Observable
で動作する唯一の方法はObserver
コールバックを介して私はPromise
を宣言し、onComplete()
コールバックでその約束を果たす必要があります。提供されたタイトルによるドキュメントがない場合のケースを処理するために、私はvar empty: Boolean = true
という変数を宣言し、それをonNext()
とonComplete()
コールバックで使用する以外の選択肢はありません。
質問:私のObserver
インスタンス内にvar
を使用しないと、これにアプローチするより良い方法はありますか?私は観察できるの代わりにFuture[T]
で動作するようにはるかに簡単になると思います
また、[that](http://reactivemongo.org/releases/0.11/documentation/tutorial/find-documents.html) – cchantep