我正在Scala寫一個Play 2.3.2應用程序。 我使用reactivemongo驅動程序訪問mongodb數據庫。 我已經寫了這個查詢數據庫,以獲得數據庫中使用最多的標籤。 這種方法是Action.async並實現爲以下幾點:瞭解Scala的未來
def max = Action.async { request =>
var max: Int = 0
var tagFound: Tag = null
//obtain all the tags in the db.
val futureTags: Future[List[Tag]] = Tags.all.toList
futureTags map{ (tags: List[Tag]) =>
tags map { (tag: Tag) =>
//create the tag String
val tagName = tag.category + ":" + tag.attr
//search in the db the documents where tags.tag == tag.
val futureRequests : Future[List[recommendationsystem.models.Request]]= Requests.find(Json.obj("tags.tag" -> tagName)).toList
futureRequests map { (requests: List[recommendationsystem.models.Request]) =>
//get the numbers of documents matching the tag
val number: Int= requests.size
if(number > max) {
max = number
tagFound = tag
}
println(max)
}
}
val jsonObject = if(max > 0) Json.obj("tag" -> tagFound, "occurencies" -> max) else Json.obj("tag" -> "NoOne", "occurencies" -> 0)
Ok(jsonObject)
}
}
但這種方法的行爲是不確定性的,什麼是錯的? 我不明白爲什麼
val jsonObject = if(max > 0) Json.obj("tag" -> tagFound, "occurencies" -> max) else Json.obj("tag" -> "NoOne", "occurencies" -> 0)
Ok(jsonObject)
}
是執行異步的,不要等到了tags map
語句完成。
感謝您的回覆,但我無法理解代碼的foldLeft部分。你能解釋你在做什麼? 否則代碼不會編譯,在我的@edit中可以看到編譯器錯誤。 – 2014-10-10 10:13:32
編譯器錯誤是對讀者的練習。我將修正簡單的 – vitalii 2014-10-10 13:50:52
foldleft這裏只是計算最大的「發生率」數字和相應的標記。您可以改爲使用可變變量,如問題所示 – vitalii 2014-10-10 13:54:37