我有一个负责处理http调用的Akka actor.我使用scala dispatch通过API发送多个HTTP请求:
urls.foreach { u
val service = url(u)
val promise = Http(service OK as.String).either
for(p <- promise)
{
p match
{
case Left(error) =>
faultHandler(error)
case Right(result) =>
resultHandler(result)
}
}
Run Code Online (Sandbox Code Playgroud)
在resultHandler函数中,我增加一个实例变量nbOfResults并与我所做的调用次数进行比较.
def resultHandler(result:String)
{
this.nbOfResults++
...
if(nbOfResults == nbOfCalls)
// Do something
}
Run Code Online (Sandbox Code Playgroud)
安全吗?愿nbOfResultsvaraible在同一时间被访问,如果两个电话同时返回结果?
现在,我认为actor或多或少等同于一个线程,因此回调函数不会同时执行.这是对的吗 ?
这是仅使用调度的 Alexey Romanov 响应的变体:
//Promises will be of type Array[Promise[Either[Throwable, String]]]
val promises = urls.map { u =>
val service = url(u)
Http(service OK as.String).either
}
//Http.promise.all transform an Iterable[Promise[A]] into Promise[Iterable[A]]
//So listPromise is now of type Promise[Array[Either[Throwable, String]]]
val listPromise = Http.promise.all(promises)
for (results <- listPromise) {
//Here results is of type Array[Either[Throwable, String]]
results foreach { result =>
result match {
Left(error) => //Handle error
Right(response) => //Handle response
}
}
}
Run Code Online (Sandbox Code Playgroud)