2016-02-09 39 views
1

我試圖實現API方法(AsyncWriteJournal.asyncWriteMessages - 阿卡2.4的持久性API的一部分),需要我返回Future[Seq[Try[Unit]]]。這個想法是可以執行許多操作,其中任何一個都可以單獨成功或失敗,將來可以用來等待所有操作的完成。即使在個別操作中存在某種類型的故障,未來本身也可以選擇成功。轉了未來[單位]成嘗試[單位]在斯卡拉

的底層操作我使用(Rediscala)返回期貨,但我堅持嘗試將Seq[Future[Unit]]轉換成所需的返回類型。我可以把它用在每個操作PromiseFuture.sequence一起綁他們,但然後將得到的未來,如果的操作的任何失敗,這是不正確的行爲

+0

Future.sequence創建的未來不應該因爲Try而導致失敗。你可以在哪裏組裝完整的未來? – Dani

回答

4

這是你想要的嗎?

def transform(ops: Seq[Future[Unit]])(implicit ec: ExecutionContext): Future[Seq[Try[Unit]]] = 
    Future.sequence(ops.map (
    _.map(Success(_)).recover { 
     case ex => Failure(ex) 
    } 
)) 
+0

是的,這是非常有益的。這不正是我已經結束了使用,但與內地圖恢復爲。謝謝。 –

1

失敗做些什麼,如果你把一個可能失敗的未來成在任何情況下都會成功的未來,然後使用Future.sequence

+0

不幸的是(我剛更新了這個問題來澄清)。某些類別的失敗(序列化)在單個操作中可能會失敗,但是不會失敗整個未來。其他類別的失敗(無法寫入數據庫)必須使整個事情失敗。我認爲鑑於差異是一種可選行爲,我將堅持我所擁有的。 –

+0

所以,你要一個失敗的將來轉化爲嘗試在某些情況下,但不是在所有? 'f.map [嘗試[單位]](R =>成功(()))中恢復。{情況c:AcceptableException =>失效(C)}' –