如何获取Future [Seq [Person]]而不是Seq [Future [Person]]

Pun*_*y V 4 scala future

我有两个外部电话

  1. 这给Future [Seq [People]]
  2. 它将person_id并返回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]]
   }) 
})
Run Code Online (Sandbox Code Playgroud)

Rya*_*yan 10

使用可以Future.sequence用来转换结果,例如:

val futureOfSeq = Future.sequence(seqOfFuture)


pra*_*upd 5

你需要遍历Listas 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" }
Run Code Online (Sandbox Code Playgroud)

现在,就像您尝试的那样,您得到了Future[List[Future[String]]]

getFuturePeople.map { people => people.map { p => getStatus(p) } }
Run Code Online (Sandbox Code Playgroud)

1)所以,不只是映射到list of people,做Future.traverse

val updatedPeople: Future[List[String]] = getFuturePeople.flatMap { people =>
       Future.traverse(people) { p =>
         getStatus(p)
       }
 }
Run Code Online (Sandbox Code Playgroud)

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)
       }
}
Run Code Online (Sandbox Code Playgroud)