如何获得 Future[Seq[Person]] 而不是 Seq[Future[Person]]
How to get Future[Seq[Person]] instead of Seq[Future[Person]]
我有两个外部电话
- 这给出了 Future[Seq[People]]
- 将 person_id 和 returns person_status 作为 Future[String]
我需要使用第一次调用中可用序列中的第二次调用来更新每个人的状态。这就是我尝试的方式,
getFuturePeople.map( (seqPeople : Seq[People]) => {
seqPeople.map(person => getStatus(person._id).status).map(status => {
//Update status for this person but I get Seq[Future[Peoson]]
})
})
使用可以使用Future.sequence
来转换结果,eg:
val futureOfSeq = Future.sequence(seqOfFuture)
你需要遍历 List
作为 Future.traverse
。
例如,
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def getFuturePeople = Future { List("Steven", "Wilson", "Michael") }
def getStatus(name: String) = Future { s"$name updated" }
现在,就像您尝试的那样,您得到 Future[List[Future[String]]]
。
getFuturePeople.map { people => people.map { p => getStatus(p) } }
1) 因此,不只是映射到 list of people
,而是 Future.traverse
,
val updatedPeople: Future[List[String]] = getFuturePeople.flatMap { people =>
Future.traverse(people) { p =>
getStatus(p)
}
}
2) 映射到 list of people
并得到 List[Future[A]]
后,使用 Future.sequence
转换为 Future[List[A]]
,
val updatedPeopleUsingSeq: Future[List[String]] = getFuturePeople.flatMap { people =>
Future.sequence {
people.map(getStatus)
}
}
像这样使用Future.sequence:
val returnedFuture :Seq[Future[People]] = Seq(Future.successful(People))
val flattenedFuture:Future[Seq[Peope]] = Future.sequence(returnedFuture)
我有两个外部电话
- 这给出了 Future[Seq[People]]
- 将 person_id 和 returns person_status 作为 Future[String]
我需要使用第一次调用中可用序列中的第二次调用来更新每个人的状态。这就是我尝试的方式,
getFuturePeople.map( (seqPeople : Seq[People]) => {
seqPeople.map(person => getStatus(person._id).status).map(status => {
//Update status for this person but I get Seq[Future[Peoson]]
})
})
使用可以使用Future.sequence
来转换结果,eg:
val futureOfSeq = Future.sequence(seqOfFuture)
你需要遍历 List
作为 Future.traverse
。
例如,
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def getFuturePeople = Future { List("Steven", "Wilson", "Michael") }
def getStatus(name: String) = Future { s"$name updated" }
现在,就像您尝试的那样,您得到 Future[List[Future[String]]]
。
getFuturePeople.map { people => people.map { p => getStatus(p) } }
1) 因此,不只是映射到 list of people
,而是 Future.traverse
,
val updatedPeople: Future[List[String]] = getFuturePeople.flatMap { people =>
Future.traverse(people) { p =>
getStatus(p)
}
}
2) 映射到 list of people
并得到 List[Future[A]]
后,使用 Future.sequence
转换为 Future[List[A]]
,
val updatedPeopleUsingSeq: Future[List[String]] = getFuturePeople.flatMap { people =>
Future.sequence {
people.map(getStatus)
}
}
像这样使用Future.sequence:
val returnedFuture :Seq[Future[People]] = Seq(Future.successful(People))
val flattenedFuture:Future[Seq[Peope]] = Future.sequence(returnedFuture)