2015-07-10 248 views
2

我在我的程序中有幾個承諾,我需要等待所有模擬前,繼續前進。對於Grails,我發現下面的例子:Groovy - 等待承諾列表

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

我知道Grails是嚴重依賴於GPars,但在那裏我找不到參照waitAll任何地方。 Grails也支持PromiseList,我在GroovyGPars中找不到。任何人都可以將我指向正確的方向嗎?

+0

什麼是Grails版本? – saw303

+0

@ saw303我對'Grails'不感興趣。這正是我遇到'waitAll'和'PromiseList'的原因。我需要在'Groovy'應用程序中直接使用相同的功能。 – WeSt

回答

4

爲WaitAll是從Promises類一個Grails特定靜態方法。它內部建立在GPars whenAllBound方法上,您可以使用它來執行。

1

它在源代碼中的真相。

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() 
} 

https://github.com/grails/grails-core/blob/master/grails-async/src/main/groovy/org/grails/async/factory/gpars/GparsPromiseFactory.groovy

2

由於defectusFeras奧德,我能想出用whenAllBound做它的正確途徑。只是爲了節省大家一樣多的時間,這裏是工作的代碼示例:

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()) 

whenAllBound預計一個名爲的結果都承諾關閉。我只是收集它們,並將它們返回原樣。另外,whenAllBound返回承諾本身,因此您需要調用.get()方法(請參閱斷言語句)。