1

HTTPBuilder.request のように、ハンドラーを使用してクロージャーを受け入れる非同期関数を作成したいと考えています。関数はどのように書かれていますか?

関数を呼び出すと、次のようになります。

// calling my function now - we'll process the results when status is available...
myFunction(arg1, arg2) {
  status.success = { result ->
    println 'cool'
  }
  status.failure = { result ->
    println 'not cool'
  }
}
4

1 に答える 1

1

の「本体」は、myFunction実際にはタイプの3番目のパラメーターですClosure。宣言すると、実際には3つのパラメーター、、、arg1およびarg2本体を含むもう1つのパラメーターが含まれます。

代理人と一緒にmyFunctionボディクロージャーを呼び出します。デリゲートは、status.successおよびstatus.failureイベントハンドラクロージャを保持します。次に、非同期操作を実行して結果をキャプチャします。最後に、適切な結果ハンドラクロージャを呼び出します。このような関数のスケルトンは次のようになります。

def myFunction(arg1, arg2, Closure body) {
    def delegateMap = [status:[:]]
    body.delegate = delegateMap
    body.call()

    // start async process
    Thread.start {
         def result = doAsyncStuff()
         if (isSuccess(result) && delegateMap.status.success) {
             delegateMap.status.success.call(result)
         }
         else if (isFailure(result) && delegateMap.status.failure) {
             delegateMap.status.failure.call(result)
         }
    }
}
于 2012-10-19T16:19:32.843 に答える