当前位置: 首页 > 知识库问答 >
问题:

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

弘浩博
2023-03-14

我有两个外部呼叫

  1. 这给了未来[Seq[人]]
  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]]
   }) 
})

共有3个答案

朱起运
2023-03-14

像这样使用 Future.sequence:

val returnedFuture :Seq[Future[People]] = Seq(Future.successful(People))

val flattenedFuture:Future[Seq[Peope]] = Future.sequence(returnedFuture)
文心思
2023-03-14

您需要以Future.traverse的形式遍历List

例子,

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)所以,不是仅仅映射人员列表,而是Future.traverse

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

2)同样有效的是,一旦你映射了人员列表并获得了List[Future[A]],使用Future.sequence转换为Future[List[A]]

val updatedPeopleUsingSeq: Future[List[String]] = getFuturePeople.flatMap { people =>
       Future.sequence {
         people.map(getStatus)
       }
}
仉宸
2023-03-14

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

val-futureOfSeq=Future.sequence(sequofuture)

 类似资料: