我正在嘗試學習Futures和ReactiveMongo。 在我的情況下,我有幾個邀請對象,並希望篩選出已經存在於數據庫中的對象。我不想更新或插入數據庫中已有的數據。因此,我創建了過濾器的方法:我應該如何處理play2和scala中的Filter和Futures
過濾方法:
def isAllowedToReview(invite: Invite): Future[Boolean] = {
ReviewDAO.findById(invite.recoId, invite.invitedUserId).map {
maybeReview => {
maybeReview match {
case Some(review) => false
case None => true
}
}
}
}
DAO:
def findById(rId: Long, userId: Long): Future[Option[Review]] = findOne(Json.obj("rId" -> recoId, "userId" -> userId))
def findOne(query: JsObject)(implicit reader: Reads[T]): Future[Option[T]] = {
collection.find(query).one[T]
}
,然後調用:
val futureOptionSet: Set[Future[Option[Invite]]] = smsSet.filter(isAllowedToReview)
save the filtered set somehow...
這不因爲過濾器期望在工作是Invite => Boolean
,但我發送Invite => Future(Boolean)
。你會如何過濾並保存這個?
你好!謝謝您的回答!我不確定我瞭解我應該如何使用filteredSet。假設我想在返回Future [Option [Invite]]的sms上調用insert方法。這將使代碼返回Future [Set [Future [Option [Invite]]]],我猜我應該以某種方式扁平化?或者,也許我應該返回您的例子中的短信,然後使用filteredSet.map()?你會怎麼做? – jakob
將會:val futureInserted:Future [Set [Option [Invited]]] = filteredSet.flatMap {} {}} Futureites(invites)(insertReview) }是遍歷futureInserted的不錯方法嗎? – jakob
確實!我認爲它會做到這一點。 – huynhjl