未来/承诺无需等待结果?返回单位

 ttarm_33218389 发布于 2023-01-29 17:03

我有关于斯卡拉的问题Future.

目前我有一个程序通过一个目录运行并检查是否有文件.如果有文件,程序应将这些文件转换为".pdf"

我的代码看起来像这样(它是伪代码):

for(file <- directory) {
  if(timestamp > filetimestamp) {
    Future {
    // do a convert job that returns UNIT
    }
  }
}

这是有效的代码还是我需要等待返回值?

还有其他替代品和Futures一样轻量级吗?

2 个回答
  • 要在里面转换Future,只需使用mapflatMap.当回调完成时,实际操作是异步执行的,但它们是类型安全的.

    import scala.concurrent.Future
    import scala.concurrent.ExecutionContext.Implicits.global
    
    for(file <- directory) {
     if(timestamp > filetimestamp) {
       val future = Future {
       // do a convert job that returns UNIT
       } map {
         file => // whatever you want.
       }
    }
    

    2023-01-29 17:05 回答
  • 警告! 如果任何Future抛出"NonFatal"错误,它将被吞下.使用Future [Unit]时这是一个严重的问题:如果没有代码评估未来,错误就会消失在黑洞中.(它会影响任何Future [_],但是如果要返回一个值,通常会对它执行某些操作,因此会发现错误.)

    scala> import scala.concurrent.ExecutionContext.Implicits.global
    scala.concurrent.Future { throw new IllegalArgumentException("foo") }
    
    scala> res16: scala.concurrent.Future[Nothing] = scala.concurrent.impl.Promise$DefaultPromise@64dd3f78
    
    scala> import scala.concurrent.ExecutionContext.Implicits.global
    scala.concurrent.Future { throw new IllegalArgumentException("foo"); 42 }
    
    scala> res11: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@65c8295b
    

    另一种方法可以完成相同的操作,但不会隐藏错误:

    scala> val context = scala.concurrent.ExecutionContext.Implicits.global
    context.execute(new Runnable {
      def run() = throw new IllegalArgumentException("foo")
    })
    context: scala.concurrent.ExecutionContextExecutor = scala.concurrent.impl.ExecutionContextImpl@1fff4cac
    
    scala>      |      | java.lang.IllegalArgumentException: foo
    at $line48.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anon$1.run(<console>:34)
    at $line48.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anon$1.run(<console>:33)
    at scala.concurrent.impl.ExecutionContextImpl$$anon$3.exec(ExecutionContextImpl.scala:107)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
    

    2023-01-29 17:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有