我想做大量的外部服務調用,每個跟進了異常處理和有條件的進一步處理。我認爲使用.onComplete內部擴展這個很好的示例(Asynchronous IO in Scala with futures)很容易,但似乎我並不瞭解有關範圍和/或期貨的內容。任何人都可以指出我正確的方向嗎?異步處理使用列表的斯卡拉期貨與onComplete異常處理
#!/bin/bash
scala -feature $0 [email protected]
exit
!#
import scala.concurrent.{future, blocking, Future, Await}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
import scala.util.{Success, Failure}
import scala.language.postfixOps
val keylist = List("key1", "key2")
val myFuts: List[Future[String]] = keylist.map {
myid => future {
// this line simulates an external call which returns a future (retrieval from S3)
val myfut = future { Thread.sleep(1); "START " + myid}
var mystr = "This should have been overwritten"
myfut.onComplete {
case Failure(ex) => {
println (s"failed with error: $ex")
mystr = "FAILED"
}
case Success(myval) => {
mystr = s"SUCCESS $myid: $myval"
println (mystr)
}
}
mystr
}
}
val futset: Future[List[String]] = Future.sequence(myFuts)
println (Await.result(futset, 10 seconds))
我的電腦(斯卡拉2.10.4)上
,這個打印:
SUCCESS key2: START key2
SUCCESS key1: START key1
List(This should have been overwritten, This should have been overwritten)
我想(順序不重要):
SUCCESS key2: START key2
SUCCESS key1: START key1
List(SUCCESS key2: START key2, SUCCESS key1: START key1)
工程很好。 .recover方法是該模式的關鍵。我沒有意識到可以做到這一點。非常感謝! –
對於那些感興趣的人,這個答案和更有效的替代方法在http://stackoverflow.com/a/15776974/29771中給出。 – Glenn