【问题标题】:Sleep inside Future in Scala.js在 Scala.js 中的 Future 中睡觉
【发布时间】:2017-10-07 18:50:47
【问题描述】:

在 Scala.js 中是否可以在 Future 中睡觉?

类似:

Future {
   Thread.sleep(1000)
   println("ready")
}

如果我尝试这个,我会得到一个异常,说 sleep 方法不存在。

在JS里好像可以睡觉:What is the JavaScript version of sleep()?虽然不能屏蔽。

【问题讨论】:

  • 只需使用链接解决方案中的pausecomp :)(我假设您完全了解为什么您大部分时间都不想这样做)。
  • 我认为下面给出的答案非常好,没有理由不应该在任何希望延迟未来的时候使用它。

标签: future scala.js


【解决方案1】:

您不能真正在未来主体的中间暂停,但您可以将您的未来注册为“延迟”未来的后续行动,您可以将其定义为:

def delay(milliseconds: Int): Future[Unit] = {
  val p = Promise[Unit]()
  js.timers.setTimeout(milliseconds) {
    p.success(())
  }
  p.future
}

然后您可以将其用作:

val readyLater = for {
  delayed <- delay(1000)
} yield {
  println("ready")
}

【讨论】:

  • 根据你是真的想睡一段特定的时间还是只是想“稍后”发生一些事情(这通常是测试所需要的),请注意 jsExt 库中的 notYet 函数,它确实更宽松的版本:github.com/jducoeur/jsext
  • 嗯...我真的不明白你的意思...稍后?谁来决定以后的事?以后就什么?你有例子吗?
  • @JustinduCoeur 根据自述文件的描述,任何正确的Future 都是notYetExecutionContext 上的 API 文档说:“通用的 ExecutionContext 在执行任何传入其执行方法的 Runnable 时必须是异步的。”。 (我们在 SJS 中使用 runNow ExecutionContext 做错了)。所以你用watcher给出的例子是IMO有点假,因为在setup返回之前不会调用正确的ExecutionContextwatcher.fullyReady(在JS中,在JVM上存在固有的竞争,有或没有notYet).
  • 嗯——知道有用。 notYet 在我创建它时确实有所作为,但不可否认,这是很久以前的事了,并且可能需要针对 runNow...
猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
相关资源
最近更新 更多