2016-07-16 9 views
6

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]で動作するようにはるかに簡単になると思います

+0

また、[that](http://reactivemongo.org/releases/0.11/documentation/tutorial/find-documents.html) – cchantep

答えて

10

import org.mongodb.scala.ObservableImplicits._ 

def findByTitle(title:String)(implicit ec:ExecutionContext): Future[Option[Document]] = { 
    val collection = db.getCollection("it") 
    collection.find(equal("title", title)) 
      .toFuture() 
      .recoverWith { case e: Throwable => { Log(e); Future.failed(e) } } 
      .map(_.headOption) 
} 

T将来的には、実際にSeq[T]です。このようにして簡単なチェックを行うと、変更可能な状態の必要性がなくなります。

+0

Brilliant、Yuvalを使用することもできます。どうもありがとう。私は、この "未来"の方法があることを知らなかった –

+0

@AlexanderArendarあなたは大歓迎です。 –

+1

正確にするためには、 'toFuture()。map {seq => if(seq.isEmpty)} else else(seq.head)}' と一致させる必要があります。 [T]]、私が間違っていなければ未来そのものではない。 –

関連する問題