Scala 阻止异步操作的惯用方法

Scala 阻止异步操作的惯用方法,scala,akka,Scala,Akka,我在看一些开源的scala项目。我看到一些人在做这样的事情: abstract class Foo{ def create(implicit ex: ExecutionContextExecutor): Seq[ResultSet] = { Await.result(createAsync(), timeout) } def createAsync()(implicit ex: ExecutionContextExecutor): Future[Seq[ResultSet]]

我在看一些开源的scala项目。我看到一些人在做这样的事情:

abstract class Foo{

def create(implicit ex: ExecutionContextExecutor): Seq[ResultSet] = {
    Await.result(createAsync(), timeout)
  }

  def createAsync()(implicit ex: ExecutionContextExecutor): Future[Seq[ResultSet]] = //implementation

... more like those 
}
使用调用每个方法是否有任何优点/缺点

隐式ex:ExecutionContextExecutor参数,而不是在类构造函数中传递ExecutionContextExecutor:

abstract class Foo(implicit ex: ExecutionContextExecutor){

def create(timeout: FiniteDuration): Seq[ResultSet] = {
    Await.result(createAsync(), timeout)
  }

  def createAsync(): Future[Seq[ResultSet]] = //implementation

... more like those 
}

是否有首选选项?

前一种方法为您提供了更大的灵活性,让您可以计划在何处执行CreateAync,因为每次您都可以决定要传入哪个ExecutionContext。问题是,你们需要这种灵活性吗?我发现大多数情况下,一个单一的ExecutionContext就足够了,但这实际上是一个个案分析的问题


一般来说,第一个代码片段非常可怕。公开一个阻止异步操作的同步包装器通常是代码气味的标志,这样的代码不能很好地扩展。

您能更改标题吗?这是一个真正的问题,它会让语言的新手受益,但我来这里是因为标题读起来像是一篇主要的观点文章。或者我只是因为在这里呆得太久而读得太多了…?@wheaties你有什么建议?不知道,ExecutionContext应该在方法还是对象上?听起来也很固执己见。ExecutionContext对方法和对象的好处?我猜你的意思是第一个选项更灵活,因为executionContext在每次调用中都作为param传递。我不会认为这是代码的味道,因为他们给了你阻塞的选择call@igx异步操作上的阻塞调用无法扩展。我个人不喜欢看到这样的代码,我只是在大型开源项目中看到过,比如phantom