2016-04-20 175 views
0

能否請你幫我把它寫在一個更好的方式:斯卡拉擺脫嵌套期貨

Future { 
    Thread sleep 200 
    5 
} onComplete{ 
    case Success(e) => Future { 
     doSomething(e) 
     Thread sleep 200 
     6 
    } onComplete { 
     case Success(e) => 
      Future { 
       doSomething(e) 
       Thread sleep 200 
      } onComplete { 
       case Success(_) => println("finished") 
       case Failure(e) => e.printStackTrace() 
      } 
     case Failure(e) => e.printStackTrace() 
    } 

    case Failure(e) => e.printStackTrace() 
} 

現在的代碼很糟糕,如果我增加了更多的期貨這樣它會變得更糟...這顯然是一個顯示問題的例子,所以我希望提到更廣泛的背景。

@update如果不夠清楚,我會盡力澄清。我有三個期貨,並要執行第一,當它完成執行第二,當它完成 - 第三。第二個將來使用第一個的結果,第三個使用第二個的結果。如果其中一個期貨失敗,則打印堆棧跟蹤並調用序列中斷。這就是我想要的代碼,以顯示前面,我想如果可能的話,要實現它更好的,非嵌套的方式。

@Update 2這也將是巨大的,如果我會處理每一個未來的失敗分開

+0

目前尚不清楚你想達到 – mfirry

+0

好吧,我更新的問題 –

回答

3

就像收藏中您可以map()flatMap()期貨(scaladoc)將它們結合起來:

Future { 
    Thread sleep 200 
    5 
}.map { result => 
    doSomething(result) 
    Thread sleep 200 
    6 
}.map { result => 
    doSomething(result) 
    Thread sleep 200 
}.onComplete { 
    case Success(_) => 
    // All steps completed successfully 
    println("finished") 
    case Failure(e) => 
    // This can be a failure from any of the steps 
    e.printStackTrace() 
} 

map生成一個結果,而flatMap生成一個Future實例。

或者您可以使用-內涵,這對於(平)地圖調用只是語法糖。

+0

感謝的話,但我可以分別處理每個未來的失敗這種做法? –

+0

您可以檢查/匹配您在故障得到什麼樣拋出的,但不能說這一步正是導致它(除非每一步拋出一個獨特類型的課程拋出的)。 [在此線程接受的答案解釋得很好(http://stackoverflow.com/questions/27945014/failure-in-scala-futures-for-comprehension)。 – alextsc