我们正在为用户编写dsl来编写域脚本,我们希望满足以下对此类脚本的期望:
我们的目标是对脚本编写者隐藏所有机制。
coroutinescope
,async
,launch
之类的关键字。 // dsl
fun handleCommand(f: suspend (Command) -> CommandResult)
// usage from script
handleCommand { cmd ->
val event = getEvent() // suspending function
// .....
}
脚本编写者无需担心async
和non-blocking
,一切都从它们中提取出来
task
中运行parallel
的实用程序,为此,我们在par
函数之后提供了此功能 // dsl
suspend fun <T> par(block: () -> T): Deferred<T> = coroutineScope {
async { block() }
}
// usage
handleCommand { cmd ->
par { //task1 }
par { //task2 }
// call other suspending functions
}
由于par
是挂起函数并需要一段代码并在新的协程中运行,因此我们可以在parallel
在par
(暂停功能)中调用handleCommand
时,一切正常,用户不需要处理coroutines
和家人
问题是,函数par
-> suspend fun <T> par(block: () -> T): Deferred<T>
的签名似乎不是惯用的,也不符合使用的一般准则suspend
和CoroutineScope
扩展名。
在上述用例/限制条件下,我可以正确执行此操作吗?还是有更好的方法来实现相同功能?