2016-04-27 41 views
0

我讀了關於Scala Futures and Promises順序執行一個任意數量的斯卡拉期貨的列表

我知道我可以使用回調,flatMap組合或理解連鎖期貨。當未來完成時,另一個未來就開始了,等等。

有沒有辦法鏈接任意數量的期貨的執行,存儲在斯卡拉集合(例如List)? 我試圖在期貨清單上調用Future.sequence,但它們一起開始並且它們同時執行(而不是順序執行)。

+2

的可能的複製[怎麼辦斯卡拉期貨的順序執行(http://stackoverflow.com/questions/20414500/how-to-do-sequential-execution-期貨在斯卡拉) –

+1

你的解決方案是在這裏:http://stackoverflow.com/a/20415056/5123895你需要提供項目和功能的列表,可以將它們中的每一個轉化爲未來,類似於Future.traverse ,但這將按順序運行。如果你已經有一份期貨清單,那麼你有一個問題,因爲它太晚了,他們已經在運行。 –

+0

我已經嘗試過在該鏈接中報告的解決方案,它的工作原理。在寫我的文章之前我讀過它,但對我來說並不明確。你在評論中的解釋幫助我理解它。謝謝 –

回答

4

我的回答是更關心如何處理任意數量的斯卡拉期貨函數的列表。

type FUTURE_FUNCTION = String => Future[String] 

    def compose(fs: List[FUTURE_FUNCTION]): FUTURE_FUNCTION = fs match { 
    case List(head) => head 
    case head :: tail => head(_).flatMap { u => compose(tail)(u) } 
    } 

在上面的代碼段中,創建一個撰寫方法與高階未來功能參數。並且這個方法迭代所有高階函數並組成一個全新的Future函數。

示例使用:

val f1: String => Future[String] = 
    (s: String) => Future { 
     s.toUpperCase 
    } 


    val f2: String => Future[String] = 
    (s: String) => Future { 
     s + " Hello World" 
    } 

    compose(List(f1, f2))("foo bar") 
    > FOO BAR Hello World 
+0

我曾嘗試使用解決方案[此處](http://stackoverflow.com/a/20415056/5123895),由@Łukasz在評論中建議。它的工作原理與概念上類似於您的解決方案。我無法提前創建期貨清單,但我需要一個函數來從「項目」中獲取Future。謝謝 –

0
def chainFutures(list: List[() => Future[Any]]): Future[Any] = { 
    list match { 
    case x :: Nil => Future.successful(x) 
    case (x :: xs) => x() flatMap (_ => chainFutures(xs)) 
    } 
} 

這應該做你想做的,如果你可以接受提供返回Future的函數列表。 List[Future[_]]的問題在於它們已經啓動了,所以它們不能被鏈接在執行方面。除了你提供單線程ExecutionContext

如果發生故障,它將返回第一個故障並停止執行另一個期貨。

+0

這完全不符合要求,當你通過一份期貨清單時,它們都已經開始並行運行。而且它不會累積結果。你可以在xs上調用tail,而你可能指的是已經是列表尾部的xs。 –

+0

我發現至少在SO上回答了關於解決您的問題的問題。請參閱對您的問題的評論中的一個鏈接 –

+0

您是對的。我編輯過。 –