2017-09-06 141 views
1

我有两个期货。我想按顺序执行它们。例如:斯卡拉未来执行

val ec: ExecutionContextExecutor = ExecutionContext.Implicits.global 
val first=Future.successful(...) 
val second=Future.successful(...) 

第一次完成后,应执行第二次。的问题是,第二应返回Future[Object]Future[Unit]所以 我不能使用完成,andThen等功能 我不能阻止使用awaitThread.sleep(...) 我不能因为执行上下文循环使用过程中的定义如下。

first.flatmap(_=> second)将不会按顺序执行。 我该怎么做?

+3

刚把'second'变成'def'而不是'val'? –

+0

也许你可以使用一些轮询第一个“未来”来完成,当它完成时运行第二个。 – SergeiK

+1

@ SaschaKolberg的建议,试着将'first'和'second'定义为'def'而不是'val',然后'first.flatmap(_ => second)'将按顺序依次完成这两个期货。 (没有必要把'first'定义为'def',但对于对称来说它似乎很好,如果first是'def',并且引用first将重新执行'Future.successful(...)'。) –

回答

0

只要您将Future指定给val,那么Future就会计划并尽快执行。为了防止这种情况,你有两个选择:

  1. 定义Futuredef
  2. 定义Future要使用它。

这里是#1的例子:

def first: Future[Int] = Future { Thread.sleep(5000); 1 } 
def second(i: Int): Future[Unit] = Future { println(i) } 
first.flatMap(i => second(i)) 

而这里的#2的例子:

for(
    i <- Future { Thread.sleep(5000); 1 }; 
    _ <- Future { println(i) } 
) yield() 

两个例子都将等待5秒钟,打印,然后1