我有两个期货。我想按顺序执行它们。例如:
val ec: ExecutionContextExecutor = ExecutionContext.Implicits.global
val first=Future.successful(...)
val second=Future.successful(...)
第一次完成后,应执行第二个。问题是第二个应该返回 Future[Object]
而不是 Future[Unit]
我无法使用已完成的andThen
等。功能我无法使用await
或Thread.sleep(...)
阻止该过程我无法用于循环,因为执行上下文是这样定义的。
first.flatmap( _=> second)
不会按顺序执行。我该怎么做?
一旦您将Future
分配给Val,该Future
就会计划,并将尽快执行。为了防止这种情况,您有两个选择:
- 在
def
中定义Future
- 定义要使用的
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