Java 等待多个scala异步
我想在执行所有异步块时关闭csv编写器Java 等待多个scala异步,java,scala,csv,async-await,sbt,Java,Scala,Csv,Async Await,Sbt,我想在执行所有异步块时关闭csv编写器 import java.io.{FileReader, FileWriter} import com.opencsv.{CSVReader, CSVWriter} import org.jsoup.helper.StringUtil import scala.async.Async.{async, await} import scala.concurrent.ExecutionContext.Implicits.global var rows = 0 r
import java.io.{FileReader, FileWriter}
import com.opencsv.{CSVReader, CSVWriter}
import org.jsoup.helper.StringUtil
import scala.async.Async.{async, await}
import scala.concurrent.ExecutionContext.Implicits.global
var rows = 0
reader.forEach(line => {
async {
val csv = new CSV(line(0), line(1), line(2), line(3), line(4));
entries(0) = csv.id
entries(1) = csv.name
val di = async(httpRequest(csv.id))
var di2 = "not available"
val di2Future = async(httpRequest(csv.name))
di2 = await(di2Future)
entries(2) = await(di)
entries(3) = di2
writer.writeNext(entries)
println(s"${csv.id} completed!!!! ")
rows += 1
}
})
writer.close();
在上面的代码编写器总是先关闭,所以我想执行所有异步块,然后关闭我的csv编写器。一个
异步块产生一个未来[a]
,其中a
在您的情况下是单位(这是赋值的类型行+=1
)
一般来说,当未来
完成时,您可以执行如下操作:
def myFuture: Future[Something] = ??? // your async process
myFuture.onComplete {
case Success(result) =>
???
case Failure(exception) =>
???
}
如果要执行某些操作,而不考虑状态,则可以跳过模式匹配:
myFuture.onComplete(_ => writer.close()) // e.g.
下面是一个框架解决方案
val allResponses = reader.map(l => {
val entries = ??? // declare entires data structure here
for {
line <- async(l)
// line <- Future.succesful(l)
csv <- async {
val csv = CSV(line(0), line(1), line(2), line(3), line(4))
entries(0) = csv.id
entries(1) = csv.name
csv
}
di <- async {
httpRequest(csv.id)
}
di2 <- async {
httpRequest(csv.name)
}
e <- async {
entries(2) = di
entries(3) = di2
entries
}
} yield e
})
val t = Future.sequence(allResponses)
t.map(a => {
val writer = new FileWriter("file.txt")
a.foreach(i => {
writer.writeNext(i)
})
writer.close()
})
val allResponses=reader.map(l=>{
val entries=???//在此处声明entires数据结构
为了{
在Future.sequence(allResponses)
类型不匹配处获取行时出错,应为:NotIntferedM[Future[NotInferedA]],actuval:Unit@GovindSingh:编译器无法推断读取器
和条目
的类型。请检查您的代码。很难用您提供的代码给出准确答案。我创建了一些伪代码来复制您的函数,它编译得很好。