等待多个scala-async

时间:2017-06-15 08:04:47

标签: java scala csv async-await sbt

我希望在执行所有异步块时关闭csv writer

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编写器。

2 个答案:

答案 0 :(得分:1)

以下是骨架解决方案。

  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()
  })

希望这有帮助。

答案 1 :(得分:0)

async块产生Future[A],其中AUnit(这是作业类型rows += 1)。

通常,您可以在Future完成后执行操作,如下所示:

def myFuture: Future[Something] = ??? // your async process

myFuture.onComplete {
  case Success(result) =>
    ???
  case Failure(exception) =>
    ???
}

如果您想要执行某些操作,无论状态如何,都可以跳过模式匹配:

myFuture.onComplete(_ => writer.close()) // e.g.