自grails 2.3以来,有task
之类的异步/承诺能力,如waitAll
。但是,一旦我有一些promise
s,如何将它们组合起来?
例如,在控制器中
def nameT = task { database1.getNameById(345L) }
def balanceT = task { database2.getBalanceById(456L) }
render nameBalanceView([name: nameT.get(), balance: balanceT.get()])
但现在我们需要阻止等待get
。
是否可以使用
render
行
task { render nameBalanceView([name: name, balance: balance]) }
为了比较,Scala可以这样做:
Action.async {
val nameF = Future { database1.getNameById(345L) }
val balanceF = Future { database2.getNameById(456L) }
val nameAndBalanceF = nameF flatMap { n => balanceF map { b => (n, b) } }
nameAndBalance map { nb => nameBalanceView(nb) }
}