Tôi biết rằng vấn đề của tôi có vẻ hơi phức tạp một chút. Nhưng tôi sẽ cố gắng thể hiện bản thân mình tốt.Làm cách nào để đợi các tác vụ không đồng bộ hoàn thành trong scala?
Tôi có phương pháp này mà tôi muốn trả lại một số Map[String, List[String]]
chứa đầy dữ liệu.
def myFunction():Map[String, List[String]] = {
val userMap = Map[String, String](("123456", "ASDBYYBAYGS456789"),
("54321", "HGFDSA5432"))
//the result map to return when all data is collected and added
val resultMap:Future[Map[String, List[String]]]
//when this map is finished (filled) this map is set to resultMap
val progressMap = Map[String, List[String]]()
for(user <- userMap){
//facebook graph API call to get posts.
val responsePost = WS.url("async get to facebook url").get()
responsePosts.flatMap { response =>
val jsonBody = response.json
val dataList = List[String]()
for(i <-0 until 5){
//parse the json-data to strings
val messages = (jsonBody.\("statuses").\("data")(i).\("message"))
val likesArray = (jsonBody.\("statuses").\("data")(i).\\("data")).flatMap(_.as[List[JsObject]])
val likes = likesArray.length
//Put post with likes in temporary list
dataList ::= ("Post: " + message.toString + " Likes: " + likes.toString)
}
//facebook graph API call to get friends.
val responseFriends = WS.url("async get to facebook url").get()
responseFriends.map { response =>
val jsonBody = response.json
val friendCount = jsonBody.\("data")(0).\("friend_count").toString
//add "Friends: xxx" to the dataList and add the new row to resultMap containig a list with post and friends.
dataList ::= ("Friends: " + friendCount)
progressMap += user._1 -> dataList
//check if all users has been updated
if(progressMap.size == userMap.size){
resultMap = progressMap
}
}
}
}
//return the resultMap.
return resultMap
}
}
Mã của tôi có thể không được viết bằng cú pháp tối ưu.
Nhưng những gì tôi muốn là trả về kết quả nàyBản đồ với dữ liệu. Vấn đề của tôi là vì "get to facebook url"
được thực hiện không đồng bộ, kết quả nàyMap được trả về trống. Tôi không muốn điều này trở nên trống rỗng.
Mã này trong phương pháp của tôi là giải pháp của tôi cho đến nay. Nó không hoạt động, rõ ràng, nhưng tôi hy vọng bạn có thể thấy những gì tôi đang cố gắng làm. Cảm thấy tự do để trả lời với suy nghĩ của bạn mặc dù bạn không chắc chắn, nó có thể đưa tôi đi đúng hướng.
cách bạn có thể nối thêm giá trị vào dataList nếu đó là val? –