scala 2.10回调在“截止日期”结束时

时间:2012-12-12 23:58:20

标签: scala scala-2.10

在Scala 2.10中,它们与新的Future / Promise API一起引入了DurationDeadline实用程序(as described here)。我环顾四周,但找不到scala标准库附带的任何东西,做类似的事情:

val deadline = 5 seconds fromNow
After(deadline){
  //do stuff
}

//or

val deadlineFuture: Future[Nothing] = (5 seconds fromNow).asFuture
deadlineFuture onComplete {
  //do stuff
}

有什么类似的东西我错过了,还是我必须自己实施这种行为?

2 个答案:

答案 0 :(得分:4)

不完全内置,但它们提供足够的绳索。

要点是等待一个必须令人失望的空洞承诺(即超时)。

import scala.concurrent._
import scala.concurrent.duration._
import scala.util._
import ExecutionContext.Implicits.global

object Test extends App {
  val v = new SyncVar[Boolean]()
  val deadline = 5 seconds fromNow
  future(Await.ready(Promise().future, deadline.timeLeft)) onComplete { _ =>
    println("Bye, now.")
    v.put(true)
  }
  v.take()
  // or
  val w = new SyncVar[Boolean]()
  val dropdeadline = 5 seconds fromNow
  val p = Promise[Boolean]()
  p.future onComplete {_ =>
    println("Bye, now.")
    w.put(true)
  }
  Try(Await.ready(Promise().future, dropdeadline.timeLeft))
  p trySuccess true
  w.take()
  // rolling it
  implicit class Expiry(val d: Deadline) extends AnyVal {
    def expiring(f: =>Unit) {
      future(Await.ready(Promise().future, d.timeLeft)) onComplete { _ =>
        f
      }
    }
  }
  val x = new SyncVar[Boolean]()
  5 seconds fromNow expiring {
    println("That's all, folks.")
    x.put(true)
  }
  x.take() // wait for it
}

答案 1 :(得分:0)

它只是一个时间戳持有者。例如,您需要在T小时内分发N个连续任务的执行。完成第一个任务后,根据(剩余时间)/(任务剩余)间隔检查截止日期并安排下一个任务。在某个时间点isOverdue()发生,您只需并行执行任务。

或者你可以检查isOverdue(),如果仍然是假,例如使用timeLeft()来设置执行下一个任务的超时时间。

比使用DateCalendar进行操纵以确定剩余时间要好得多。此外,Akka还使用了持续时间。