2017-09-06 139 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