2017-09-06 5 views
1

私は2つの先物があります。私はそれらを順番に実行したい。例:スカラの今後の実行

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

最初に完了したら、次に2番目を実行します。問題は、第二は、私が完了使用することができないので、 Future[Object]ないFuture[Unit]andThen等の機能 私は実行コンテキストのでループに使用できませんawait又はThread.sleep(...) を用いた処理をブロックすることができないが、このように定義されるを返すべきであるということです。

first.flatmap(_=> second)は順番に実行されません。 どうすればいいですか?

+3

だけを5秒間待ってから印刷します'second'を' val'の代わりに 'def'にしますか? –

+0

おそらく完了のために最初の 'Future'のポーリングを使うことができ、完了したら2番目の' 'Future''を実行します。 – SergeiK

+1

@ SaschaKolbergの提案に従い、 'first'と' second'の両方を 'val'ではなく' def'と定義すると、 'first.flatmap(_ => second)'は2つの先物を順番に順番に完了します。 (最初のものを 'def'として定義する必要はあまりありませんが、対称性のために最初は' def'で、最初のものは 'Future.successful(...)'を再実行します)。 –

答えて

0

Futureをvalに割り当てるとすぐに、Futureがスケジュールされ、できるだけ早く実行されます。これを防ぐには次の2つのオプションがあります:

  1. を定義def
  2. 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() 

両方の例は、1

関連する問題