我有一段代碼向一組角色發送廣播消息並收集他們的響應。請看簡化代碼:斯卡拉:摺疊一系列期貨的正確方法是什麼?
{
val responses: Set[Future[T] = // ask a set of actors
val zeroResult: T
val foldResults: (T, T) => T
//1. Future.fold(responses)(zeroResult)(foldResults)
//2. (future(zeroResult) /: responses) { (acc, f) => for { x <- f; xs <- acc } yield foldResults(x, xs) }
} foreach {
client ! resp(_)
}
然後我注意到代碼1和代碼行2的行爲不同。例如。有4名參與者發送Traversable的(1)作爲響應,並且
zeroResult = Traversable.empty[Int]
foldResults = { _ ++ _ }
第一行的結果是不同的:通常我得到列表(1,1,1,1),但有時列表(1,1 ,1)或甚至列表(1,1)。這對我來說並不奇怪,因爲Future.fold正在暢通無阻,所以看起來有些反應可能會被忽略。
但第二行總是產生四個列表。
任何人都可以解釋這種摺疊不同的原因,哪些更好?
是對摺的原因收集所有回覆?如果是這樣,我建議只使用Future.sequence將響應未來列表轉換爲響應列表的未來,當所有響應都已失敗或失敗時將完成響應列表 –