Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala Future中执行N次_Scala_Http_Asynchronous - Fatal编程技术网

在Scala Future中执行N次

在Scala Future中执行N次,scala,http,asynchronous,Scala,Http,Asynchronous,我试图找到一种更优雅的方法来执行2次返回未来[HttpReporte]的函数,然后使用2端调用的响应 for { // function post returns a Future[HttpResponse] response <- post(uri, payload) // 1st response <- post(uri, payload) // 2end } yield { // do something with the 2end respon

我试图找到一种更优雅的方法来执行2次返回未来[HttpReporte]的函数,然后使用2端调用的响应

for {
    // function post returns a Future[HttpResponse]
    response <- post(uri, payload) // 1st
    response <- post(uri, payload) // 2end
} yield {
    // do something with the 2end response
}
用于{
//函数post返回未来[HttpResponse]

响应理想情况下,您可能需要以下内容:

Future.sequence(Stream.fill(n)(post(uri, payload)))
但是,如果您真的希望它是连续的,这是行不通的,因为
Future.sequence
急切地评估
流,并并行启动所有未来。有一些解决方案可以解决该问题。例如,用户版本的sequence按顺序工作:

这应该是:

val result = Seq.fill(2)(post(uri, payload)).last
我用以下代码测试了这一点:

 val result = Seq.fill(2)(dummyFut()).last

  def dummyFut(): Future[Long] = Future.successful{
    Thread.sleep(1000L)
    println(System.currentTimeMillis())
    System.currentTimeMillis()
  }

  result.foreach(println)
这张照片是:

1552852972738
1552852973749
1552852973749

如果需要对返回
Future
的方法进行两次连续调用,可以使用
flatMap

post(uri, payload).flatMap(_ => post(uri, payload))
在第一个操作完成之前,这不会启动第二个
post
操作

如果您有多个链式呼叫,您可以在
范围内使用
foldLeft
将其应用到适当的次数:

(0 to N-1).foldLeft(post(uri, payload)){
  case (prev, _) => prev.flatMap(_ => post(uri, payload))
}

实际上,您可能会使用
范围中的值来跟踪此操作的进度,而不是放弃它。

这两个调用是同时执行还是按顺序执行?按顺序:-)更新我的答案以按顺序工作。谢谢。有趣的是,它适用于@Martin,这实际上不会在将来运行s顺序。它与示例中的类似,因为pme正在使用
Future.successful
,它在同一线程上运行提供的代码,而不是
Future.apply
。将
Future.successful{
替换为
Future{
你会发现它没有在正确的时间打印出来。@BrianMcCutchon谢谢你指出这一点-所以我很幸运;(。
1552852972738
1552852973749
1552852973749
post(uri, payload).flatMap(_ => post(uri, payload))
(0 to N-1).foldLeft(post(uri, payload)){
  case (prev, _) => prev.flatMap(_ => post(uri, payload))
}