阻止异步操作的惯用方法

时间:2017-01-31 14:51:34

标签: 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]] = //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 
}

有首选方案吗?

1 个答案:

答案 0 :(得分:1)

前一种方法可以让您更灵活地安排执行createAsync的位置,因为每次您都可以决定要传递哪个ExecutionContext。问题是,你需要这种灵活性吗?我发现大多数时候单ExecutionContext就足够了,但这实际上是个案分析的问题。

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