簡體   English   中英

反向Future.sequence

[英]Reverse of Future.sequence

我知道Future.sequence調用可以將List[Future[T]]轉換為Future[List[T]] ,但如果我想Future.sequence呢?

我想將Future[List[T]]轉換為List[Future[T]]

我想這樣做的原因如下:

我向使用Slick 3查詢數據庫的actor發送消息。 Slick查詢返回list: Future[List[T]] 如果我可以將此list轉換為list: List[Future[T]] ,那么我將能夠:

list.map(convertToMessage).foreach(m => m pipeTo sender())

所以基本上我想將從DB中提取的每條記錄轉換成一條消息,然后將其發送給一個調用actor。

抱歉,我不認為這是可能的。

Future[List[T]]可以用空列表,包含一個元素的列表或任意數量的元素來完成。

因此,如果您將其轉換為List[Future[T]] ,該列表將包含多少個Futures?

而不是使用akkas pipeTo模式,你可以做類似的事情:

// capture the sender, before the future is started - just like pipeTo does
val s = sender()
futureOfListOfFoo.foreach { listOfFoo =>
  listOfFoo.map(convertToMessage).foreach { foo => s ! foo }
}

你為什么要這樣做? 你想達到什么目的? 一旦您的未來結算,列表中的所有項目都可用,因此您可以通過將每個項目提升到自己的未來而獲得很少的收益。

無論如何:

import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

// Assuming some starting future.
val foo: Future[List[String]] = Future.successful(List("foo"))

// This is pointless, because all we're doing is lifting each item in the list into its own already resolved future.
val bar: Future[List[Future[String]]] = foo.map(_.map(Future.successful))

// NB: you shouldn't use Await.
val baz: List[Future[String]] = Await.result(bar, 0.nanos)

暫無
暫無

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

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