2016-03-07 22 views
2

我想了解以下的答案How to carry on executing Future sequence despite failure?。 (希望那不是向下表決值得,因爲我想了解這裏的代碼。)變換未來[T]給未來[嘗試[T]

我不明白mapValue如何改變未來[T]給未來[嘗試[T]

def mapValue[T](f: Future[T]): Future[Try[T]] = { 
    val prom = Promise[Try[T]]() 
    f onComplete prom.success 
    prom.future 
} 

行onComplete prom.success,它在做什麼。我的理解是prom.success必須接受Try [T]類型的對象,但在這裏它不會那樣做。也沒有任何賦予f將Future [T]轉換爲Future [Try [T]]的任務。 此外,anThen在未來應該是一個sideffect並且應該返回走進它的未來是相同的值,所以不知道如何轉變發生。

+0

爲什麼包裝'Try'那裏,'Future'處理錯誤 – cchantep

+0

看看原題鏈接瞭解情況 – konquestor

+0

能否請你舉個例子?即 - 'mapValue(示例)'然後預期輸出? –

回答

2

f onComplete prom.success線由Scala編譯器解析如下:

  1. 點和括號可以在某些情況下中省略,所以f onComplete x是寫f.onComplete(x)一種方式。
  2. 編譯器看到該onComplete方法採用作爲參數函數f: Try[T] => U。您還傳遞了一個函數作爲參數,Promise#success,它具有兼容的簽名。

那麼,什麼方法是做Try[T]類型是創建一個新Promise(可寫的未來),以及完成這一承諾與包裹Try[T]爲原來的將來完成。然後它返回從諾言獲得的新的Future[Try[T]]

+0

感謝@maxim什麼是混亂的,又是怎樣的承諾抵達該處完成,prom.success像你指出的那樣返回一個函數。以及promise.future如何將T分配給它?你是否建議當f.onComplet被執行時,f的值被傳遞給prom.success? a – konquestor

+0

當您調用'prom.success'時,承諾返回的未來是由承諾內部邏輯完成的。代碼中沒有變量賦值,它在承諾代碼內。 – Maxim

+0

通常Promise#Success會在Future中返回一個參數。這裏prom.succes沒有采取任何參數。 – konquestor