scala - 如何同时发出 10 个 http 请求?
问题描述
我有 10 个请求
val reqTemplate = quickRequest.post(uri"http://localhost:8280/delay/1")
val requests = for {i <- 1 to 10} yield {
reqTemplate.body(s"{test:$i}")
}
如何同时发送这些请求?
我试过
val responseTasks = reqs.map(SttpClient.send)
val allResponsesTask: Task[List[Response[String]]] = ZIO.collectAllPar(responseTasks)
val appLogic: Task[Unit] = for {
resps <- allResponsesTask
resp <- resps
_ <- putStrLn(resp.toString())
_ <- putStrLn("Done")
} yield ()
Runtime.default.unsafeRunAsync(appLogic)
但这给了我各种有趣的编译错误。
Error:(18, 74) type mismatch;
found : scala.collection.immutable.IndexedSeq[zio.ZIO[sttp.client.asynchttpclient.zio.SttpClient,Throwable,sttp.client.Response[String]]]
(which expands to) scala.collection.immutable.IndexedSeq[zio.ZIO[zio.Has[sttp.client.SttpBackend[zio.Task,Nothing,sttp.client.asynchttpclient.WebSocketHandler]],Throwable,sttp.client.Response[String]]]
required: Iterable[zio.ZIO[Any,Throwable,sttp.client.Response[String]]]
val allResponsesTask: Task[List[Response[String]]] = ZIO.collectAllPar(responseTasks)
Error:(23, 7) type mismatch;
found : zio.ZIO[zio.console.Console,Nothing,Unit]
(which expands to) zio.ZIO[zio.Has[zio.console.Console.Service],Nothing,Unit]
required: scala.collection.GenTraversableOnce[?]
_ <- putStrLn(response.toString())
Error:(22, 14) type mismatch;
found : List[Nothing]
required: zio.ZIO[Any,Throwable,Unit]
response <- responses
解决方案
问题是您已经声明了Sttp
依赖项但您没有提供它。
如果你注释responsesTask
你会看到它实际上是类型Seq[ZIO[SttpClient, Throwable, Response[String]]]
,意味着你需要提供一个客户端来满足依赖。
我会将其更改为:
val allResponsesTask: Task[List[Response[String]]] =
ZIO.collectAllPar(responseTasks)
.provideLayer(AsyncHttpClientZioBackend.layer())
请注意,为了简单起见,我在此处添加了层,但通常您希望在应用程序的边缘添加所有层,因为创建层不是免费的。
推荐阅读
- typescript - 如何让打字稿意识到`find`可能返回未定义?
- javascript - 如何使用 Javascript 将数据从所有 WebGrid 行传递到 MVC 控制器?
- ruby-on-rails - 如何将 joins 方法与 first_or_initialize 而不是 find_or_initialize_by (Rails)一起使用?
- android - 错误:无法解决:Toasty 受影响的模块:app
- c++ - 如何创建一个类似于“范围”的可迭代浮点对象?
- c# - 实现 GroupStyle 时 ListCollectionView.Refresh() 抛出 ArgumentOutOfRange 异常
- r - 获取 CSV 文件的列名
- python - 数据帧循环停止
- vb.net - 按钮处理程序在自定义 MessageBox 类中不起作用
- c# - MongoDB c#驱动程序,使用来自另一个实体字段的数据更新一个实体字段