2014-12-02 91 views
0

快速的問題,如果在斯卡拉你成功承諾這樣的承諾,斯卡拉諾言澄清

val successful = Promise[List[T]]()  //Create a promise which will be returning the results 
successful.success(Nil) 

這會不會完成承諾,因此不會允許您進一步寫入承諾?哪些還會觸發onComplete回調的承諾?

我問的原因是我想了解下面的一段代碼,我試圖理解爲什麼在未來的計算開始之前,這個承諾被初始化爲零。

def all[T](fs: List[Future[T]]): Future[List[T]] = { 
    val successful = Promise[List[T]]()  //Create a promise which will be returning the results 
    successful.success(Nil)     //Initialize the profile 
    fs.foldRight(successful.future) {  //Create the Aggregate for the fold right which will be an empty future 
    //for each element extract the element from the future and append to our aggregate 
    //f -> Future[T] acc -> Future[List[T]] 
    (f, acc) => for { x <- f; xs <- acc } yield x :: xs 
    } 
} 

思考出來大聲我要說完成承諾的原因是,有沒有callbacsk連接,因此,當它成功,我們不關心。如果是這樣,唯一的原因是使用承諾就是利用它的未來。那麼,如果不使用我們實際上不需要的承諾,它們就不是一種更簡單/更簡潔的方式來定義未來?

+0

在這種情況下,它需要處理'fs'爲空的情況。 – Ryan 2014-12-02 19:03:05

+0

所以我們假設fs不爲null。由於之前的成功,foldright會觸發onComplete回調嗎? – MrX 2014-12-02 19:06:55

+0

沒有調用'onComplete'來註冊回調。 – vptheron 2014-12-02 19:20:15

回答

1

是的,一個承諾只完成一次(我不知道你的意思是「onComplete回調」,我沒有看到標準庫Promise文檔中的這樣的事情)。但是,當然承諾的future可用並按預期工作,即使承諾已經完成。這看起來是一種使用Future.successful(Nil)作爲foldRight的初始元素的過於複雜的方式。

+0

對不起onComplete我指的是承諾的onSuccess方法,它不是代碼中的任何地方,但它只是一個假設的問題。 因此,要確保我明白你正確 successful.success(無) 初始化未來:未來[列表[T]爲零,這將在foldRight可基本使用。 有沒有辦法以更優雅的方式編寫下面的代碼? – MrX 2014-12-02 19:34:08

+0

您可以將代碼編寫爲'fs.foldRight(Future.successful(List [T]())){...'。如果你使用Scalaz並且在範圍內有一個隱含的ExecutionContext,那麼整個函數就是'fs.sequence'(至少我認爲* scalaz在某處有一個'Applicative [Future]')。 – lmm 2014-12-02 19:45:55