2016-03-04 33 views
0

我有一系列返回未來的函數。我想依次執行它們,即在第一個功能未來完成之後,執行下一個功能,等等。有沒有辦法做到這一點?執行順序返回未來的函數

OPS:序號[()=>未來[單位]

回答

3

可以將所有期貨合併成一個單一的一個具有foldLeftflatMap

def executeSequentially(ops: Seq[() => Future[Unit]])(
    implicit exec: ExecutionContext 
): Future[Unit] = 
    ops.foldLeft(Future.successful(()))((cur, next) => cur.flatMap(_ => next())) 

foldLeft確保從左至右flatMap給出順序執行的順序。功能是用ExecutionContext執行的,所以調用executeSequentially不會阻塞。如果需要,您可以添加回調或等待產生的Future

如果您正在使用Twitter Future S,那麼我想你不會需要通過ExecutionContext,但foldLeftflatMap的總體思路應該仍然工作。

+0

感謝

Val a: Seq[Future[T]] = ??? val resut: Future[Seq[T]] = Future.sequence(a) 

有點少樣板非常。 – Jonna

0

我相信這應該這樣做:

import scala.concurrent.{Await, Future} 
import scala.concurrent.duration.Duration 

def runSequentially(ops: Seq[() => Future[Unit]]): Unit = { 
    ops.foreach(f => Await.result(f(), Duration.Inf)) 
} 

如果你想等不到Duration.Inf,或者在故障停止 - 應很容易做到。

2

如果給出的是序列[未來[T]你可以把它轉換成未來[序列[T]像這樣:除上述:)