2016-04-27 9 views
0

私は約Scala Futures and Promisesを読んでいます。Scala Futuresの任意の数のリストの順次実行

私は、コールバック、flatMapコンビネータ、または未来のチェーンを理解するためにコールバックを使用できることを知っています。未来が完了すると、別の未来が始まります。

スカラコレクションに格納されている任意の数の先物の実行をチェーンする方法はありますか(たとえば、List)? この先物リストでFuture.sequenceを呼び出しようとしましたが、それらはすべて一緒に開始され、同時に実行されます(逐次ではありません)。

+2

可能な重複[Scalaでは先物の逐次実行を行う方法](http://stackoverflow.com/questions/20414500/how-to-do-sequential-execution- of future in-scala) –

+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) } 
    } 

、高次将来の機能をCOMPOSE方法を生成パラメータ。このメソッドはすべての高次関数を繰り返し、完全な新しい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

私はコメントで@Łukaszによって提案された解決策[ここ](http://stackoverflow.com/a/20415056/5123895)で試しました。それは動作し、概念的にはあなたのソリューションに似ています。先物のリストはあらかじめ作成することはできませんが、「アイテム」から未来を得るための関数が必要です。ありがとう –

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

将来を返す関数のリストを提供することができれば、これは必要なものです。 List[Future[_]]の問題は、すでに開始されているため、実行に関して連鎖できないことです。あなたは単一のスレッドExecutionContextを提供します。

障害が発生した場合、最初の失敗を返し、他の先物の実行を停止します。

+0

これは単純に尋ねられたことをしません。先物のリストを渡すと、それらはすべて既に開始され、並行して実行されます。そして結果は蓄積されません。そしてあなたはxsをtailと呼んでいますが、すでにリストの末尾にあるxsを意味するはずです。 –

+0

私はあなたの問題を解決するために少なくとも答えられた質問を見つけました。あなたの質問へのコメントに1つのリンクを参照してください。 –

+0

あなたは正しいです。私は編集しました。 –

関連する問題