Grails Groovy-等待承诺列表

Grails Groovy-等待承诺列表,grails,groovy,promise,Grails,Groovy,Promise,我的计划中有几个承诺,我需要同时等待所有承诺,然后再继续。对于Grails,我发现了以下示例: def p1 = task { 2 * 2 } def p2 = task { 4 * 4 } def p3 = task { 8 * 8 } assert [4,16,64] == waitAll(p1, p2, p3) 我知道Grails在很大程度上依赖于它,但我在那里的任何地方都找不到对waitAll的引用Grails也支持,我在Groovy或GPars中也找不到。有人能给我指出正确的方向吗?

我的计划中有几个承诺,我需要同时等待所有承诺,然后再继续。对于
Grails
,我发现了以下示例:

def p1 = task { 2 * 2 }
def p2 = task { 4 * 4 }
def p3 = task { 8 * 8 }
assert [4,16,64] == waitAll(p1, p2, p3)

我知道Grails在很大程度上依赖于它,但我在那里的任何地方都找不到对
waitAll
的引用
Grails
也支持,我在
Groovy
GPars
中也找不到。有人能给我指出正确的方向吗?

事实上,它在源代码中

import groovyx.gpars.dataflow.Dataflow

def <T> List<groovyx.gpars.dataflow.Promise<T>> toGparsPromises(List<Promise<T>> promises) {
    final List<groovyx.gpars.dataflow.Promise<T>> dataflowPromises = promises.collect() { it -> (groovyx.gpars.dataflow.Promise<T>)((GparsPromise<T>)it).internalPromise }
    dataflowPromises
}

private static Closure<List<?>> originalValuesClosure = { List<?> values -> values }

def <T> List<T> waitAll(List<Promise<T>> promises) {
    final groovyx.gpars.dataflow.Promise<List<T>> promise = (groovyx.gpars.dataflow.Promise<List<T>>)Dataflow.whenAllBound(toGparsPromises(promises), originalValuesClosure)
    return promise.get()
}
导入groovyx.gpars.dataflow.dataflow
def列表承诺(列表承诺){
最终列表dataflowPromises=promises.collect(){it->(groovyx.gpars.dataflow.Promise)((GparsPromise)it.internalPromise}
数据流承诺
}
私有静态闭包值->值}
def List waitAll(列表承诺){
最终groovyx.gpars.dataflow.Promise承诺=(groovyx.gpars.dataflow.Promise)数据流
返回承诺。获取()
}

waitAll是类中特定于Grails的静态方法。它内部建立在GPars方法之上,您可以将其用于您的实现。

多亏了defectusFeras Odeh,我可以找到正确的实现方法。为了节省其他人一点时间,下面是一个工作代码示例:

import static groovyx.gpars.dataflow.Dataflow.task
import static groovyx.gpars.dataflow.Dataflow.whenAllBound;

def p1 = task { 2 * 2 }
def p2 = task { 4 * 4 }
def p3 = task { 8 * 8 }
def total = whenAllBound(p1, p2, p3, { List<?> values -> values })
assertTrue([4,16,64] == total.get())
导入静态groovyx.gpars.dataflow.dataflow.task
导入静态groovyx.gpars.dataflow.dataflow.whenAllBound;
def p1=任务{2*2}
DEFP2=任务{4*4}
def p3=任务{8*8}
def total=绑定时(p1、p2、p3,{列表值->值})
assertTrue([4,16,64]==total.get())

whenAllBound
期望一个名为的闭包,其结果是所有承诺的结果。我只是简单地收集它们并按原样归还它们。另外,
whenAllBound
本身返回一个承诺,因此需要对其调用
.get()
方法(请参见断言语句)。

什么是Grails版本?@saw303我对
Grails
不感兴趣。这就是我遇到
waitAll
PromiseList
的原因。我直接在
Groovy
应用程序中需要相同的功能。