2

我有两个未来。我想按顺序执行它们。例如:

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

当第一个完成时,应该执行第二个。问题是第二个不应该返回Future[Object] 所以Future[Unit]我不能使用完成andThen等功能我不能阻止进程使用await或者Thread.sleep(...) 我不能使用for循环,因为执行上下文是这样定义的。

first.flatmap( _=> second)不会按顺序执行。我怎样才能做到这一点?

4

1 回答 1

1

一旦您将 a 分配Future给 val,它Future就会被安排并尽快执行。为防止这种情况,您有两种选择:

  1. 定义Future在一个def
  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

于 2017-09-06T10:06:42.607 回答