0

我想在一个动作中并行处理多个任务,并在完成后立即按最先完成的顺序推回任何任务结果。

例如,如果任务 A 在 5 秒内完成,任务 B 在 3 秒内完成,任务 C 在 1 秒内完成,则输出应为“C”、“B”、“A”。

以下代码似乎输出错误的顺序,并在输出结果之前等待所有任务完成。

def lookup  = Action { implicit  req =>
    val a = Enumerator( Await.result(Promise.timeout("A", 5 seconds), 1 minute))
    val b = Enumerator( Await.result(Promise.timeout("B", 3 seconds), 1 minute))
    val c = Enumerator( Await.result(Promise.timeout("C", 1 second), 1 minute))

    val d = a >- b >- c

    Ok.chunked(d &> Comet(callback = "console.log"))
}
4

1 回答 1

0

由于您的使用方式,您的代码已损坏Await.result。定义的行a直到返回才完成Await.result,因此承诺b直到 fora完成后才开始。如果你使用类似的东西:

val a = Enumerator.flatten(Future.firstCompletedOf(List(
  Promise.timeout("A", 5 seconds),
  Promise.timeout(throw new Exception("A timed out"), 1 minute)
)).map(Enumerator(_)))

你会得到正确的行为。

于 2014-06-25T14:13:35.587 回答