不同类中的CoroutineScope扩展功能

时间:2019-03-13 22:29:38

标签: kotlin kotlin-coroutines

我正在尝试对CoroutineScope.()使用扩展功能来启动一些异步工作。 我不确定如何从主类中调用此方法,请参见下文:

class MyService {
   fun CoroutineScope.getFoo() = async(IO/Single/Default) { //work }
}

class MyProgram(val service : MyService) : CoroutineScope {

   fun main() {
      launch {
         val deferred = service.getFoo() // doens't work, can't find getFoo

         // works, but looks a bit odd IMO, is there a better way?
         val deferred = with(service) { getFoo() }

         //some work

         deferred.await()
      }

   }

}

我知道我可以将async {}关键字移到我的主要方法中,但是以这种方式,调用者将不得不确定调度程序,我不认为这是要走的路。

该服务知道其工作的性质(IO /计算绑定单线程?等),我认为应该由它来决定调度程序。

2 个答案:

答案 0 :(得分:1)

为什么不使getFoo成为普通函数并传递范围:

fun getFoo(scope: CoroutineScope) = scope.async {
    //work }
}

launch {
    service.getFoo(this)
}

答案 1 :(得分:1)

据我了解,您的意图是让服务指定调度程序。为什么不拆分调度程序的规范和异步运行的决定?

让服务功能可挂起,并使用withContext指定调度程序。 然后让调用者决定函数是否应该异步运行。

class MyService {
    suspend fun getFoo() = withContext(Dispatchers.IO) {
        //work 
    }
}

abstract class MyProgram(val service: MyService) : CoroutineScope {

    fun main() {
        launch {
            val deferred = async { service.getFoo() }

            //some work

            deferred.await()
        }
    }
}