簡體   English   中英

玩鏈期貨

[英]Play chain futures

我正在為scala框架開發一些小型網頁,我使用mongodb

成員文檔具有meberinfo包含成員ID,出席文檔具有

某人的出勤信息。

所以,我想先找到某個組中的成員,然后再

查找會員的出席信息。

我的代碼如下

def attendanceBySubGroup(group: String, sub_group: String) = Action.async{

    var  obj : JsObject = Json.obj("group" -> group)
    if(sub_group ne "All"){
      obj = obj + ("sub_group" -> JsString(sub_group))
    }

    val cursor: Cursor[JsObject] = member_list.find(obj).cursor[JsObject]

    // gather all the JsObjects in a list
    val futureMemberList: Future[List[JsObject]] = cursor.collect[List]()




    val futurePersonsJsonArray: Future[JsArray] = futureMemberList.map {
      val m = ArrayBuffer.empty[JsObject]
      members => members.map{
        member => {
          val futureItem = attendance_list.find(Json.obj("member_id" -> member.\("_id").\("$oid"))).one[JsObject]
          futureItem.map {
            case Some(item) => member.+(("attendance" , item.\("attendance")))
            case None => member.++(Json.obj("attendance"-> false))
          }
        }
      }
      Json.arr(m.toList)
    }



    futurePersonsJsonArray.map {
      members =>
        Ok(members(0))
    }

但是,我不想這樣做

也許,futureItem.map {..是異步調用...

我如何返回會員列表,包括出勤信息。

謝謝你的幫助

我不確定,這是最好的解決方案...

但它可以正常工作。

任何人都可以找到更好的解決方案..請發表您的答案

  def attendanceBySubGroup(group: String, sub_group: String) = Action.async{

    var  obj : JsObject = Json.obj("group" -> group)
    if(sub_group ne "All"){
      obj = obj + ("sub_group" -> JsString(sub_group))
    }

    val cursor: Cursor[JsObject] = member_list.find(obj).cursor[JsObject]

    // gather all the JsObjects in a list
    val futureMemberList: Future[List[JsObject]] = cursor.collect[List]()

    val futureMemberListWithAttendance = futureMemberList.map {
      members =>  members.map{
        member => {
           val futureItem = attendance_list.find(Json.obj("member_id" -> member.\("_id").\("$oid"))).one[JsObject]
           futureItem.map[JsObject] {
            case Some(item) => member.+(("attendance" , item.\("attendance")))
            case None => member.++(Json.obj("attendance"-> false))
          }
        }
      }
    }

    futureMemberListWithAttendance.map{
     val memberAttendances = ArrayBuffer.empty[JsObject]
     aa => Await.result(Future.reduce(aa)((s1, s2) => {memberAttendances+=s1; s1 } ) , Duration.Inf)
     Ok(Json.arr(memberAttendances))
   }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM