

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 非同期メソッドにデータを渡す
<a name="advanceddatapassing"></a>

**Topics**
+ [コレクションとマップを非同期メソッドに渡す](#advanceddatapassing.collections)
+ [設定可能 <T>](#advanceddatapassing.settable)
+ [@NoWait](#advanceddatapassing.nowait)
+ [プロミス <Void>](#advanceddatapassing.promise)
+ [AndPromise と OrPromise](#advanceddatapassing.andorpromise)

`Promise<{{T}}>` の使用については、前のセクションを参照してください。`Promise<{{T}}>` の高度なユースケースはこちらで確認できます。

## コレクションとマップを非同期メソッドに渡す
<a name="advanceddatapassing.collections"></a>

フレームワークは、非同期メソッドの `Promise` タイプとして、配列、コレクション、マップを渡すことができます。たとえば、以下のリストに示すように、非同期メソッドでは、`Promise<ArrayList<String>>` を引数として使用することができます。

```
@Asynchronous
public void printList(Promise<List<String>> list) {
    for (String s: list.get()) {
        activityClient.printActivity(s);
    }
}
```

意味的に、これは `Promise` タイプの他のパラメータとして動作し、非同期メソッドは、コレクションが実行前に利用可能になるまで待機します。コレクションのメンバーが `Promise` オブジェクトの場合は、以下のスニペットで示すように、すべてのメンバーが準備状態になるまでフレームワークで待機させることができます。これにより、非同期メソッドは、コレクションの各メンバーが利用可能になるまで待機します。

```
@Asynchronous
public void printList(@Wait List<Promise<String>> list) {
  for (Promise<String> s: list) {
      activityClient.printActivity(s);
  }
}
```

 `Promise` オブジェクトを含むことを示すには、パラメータで `@Wait` 注釈を使用する必要があります。

 このアクティビティ `printActivity` では、`String` 引数を使用しますが、生成されたクライアントの一致メソッドでは、Promise<String> が使用されます。クライアントでメソッドを呼び出します。アクティビティメソッドを直接呼び出すことはありません。

## 設定可能 <T>
<a name="advanceddatapassing.settable"></a>

`Settable<{{T}}>` は、`Promise<T>` から派生したもので、`Promise` の値を手動で設定できる設定メソッドです。たとえば、次のワークフローは、`Settable<?>` で待機して、シグナルを受け取るのを待ちます。このシグナルは、シグナルメソッドで設定されます。

```
public class MyWorkflowImpl implements MyWorkflow{
   final Settable<String> result = new Settable<String>();

   //@Execute method
   @Override
   public Promise<String> start() {
      return done(result);
   }

   //Signal
   @Override
   public void manualProcessCompletedSignal(String data) {
      result.set(data);
   }

   @Asynchronous
   public Promise<String> done(Settable<String> result){
       return result;
   }
}
```

`Settable<?>` を一度に別の Promise に連鎖することもできます。Promise をグループ化するには、`AndPromise` および `OrPromise` を使用します。連鎖された `Settable` を解除するには、`unchain()` を呼び出します。連鎖されている場合は、連鎖されている Promise が準備状態になると、`Settable<?>` も自動的に準備状態になります。連鎖は、プログラムの他の部分の `doTry()` の範囲内から返った Promise を使用する場合に特に便利です。`TryCatchFinally` はネストされたクラスとして使用されるため、親のスコープ`Promise<>`で を宣言して で設定することはできません`doTry()`。これは、Java では、変数が親スコープで宣言され、ネステッドクラスで final とマークされる必要があるためです。例:

```
@Asynchronous
public Promise<String> chain(final Promise<String> input) {
    final Settable<String> result = new Settable<String>();

    new TryFinally() {

        @Override
        protected void doTry() throws Throwable {
            Promise<String> resultToChain = activity1(input);
            activity2(resultToChain);

            // Chain the promise to Settable
            result.chain(resultToChain);
        }

        @Override
        protected void doFinally() throws Throwable {
            if (result.isReady()) { // Was a result returned before the exception?
                // Do cleanup here
            }
        }
    };

    return result;
}
```

`Settable` を一度に 1 つの Promise に連鎖できます。連鎖された `Settable` を解除するには、`unchain()` を呼び出します。

## @NoWait
<a name="advanceddatapassing.nowait"></a>

`Promise` を非同期メソッドに渡すと、デフォルトでは、フレームワークは、メソッドを実行する前に `Promise` が準備状態になるまで待機します (コレクションタイプの場合を除く)。この動作を上書きするには、非同期メソッドの宣言のパラメータに `@NoWait` 注釈を使用します。この方法は、`Settable<T>` で渡す場合に便利です。これにより、非同期メソッドが再帰的に設定されます。

## プロミス <Void>
<a name="advanceddatapassing.promise"></a>

非同期メソッドの依存関係は、他のメソッドに渡す引数として、メソッドで返る `Promise` を渡して実装されます。ただし、メソッドから `void` を返しても、完了後に他の非同期メソッドが実行される場合があります。このような場合は、`Promise<Void>` をメソッドの戻り値として使用できます。`Promise` クラスでは、`Promise<Void>` オブジェクトの作成に使用する静的メソッド `Void` が指定されます。この `Promise` により、非同期メソッドで実行されると準備状態になります。この `Promise` は、他の `Promise` オブジェクトのように他の非同期メソッドに渡すことができます。`Settable<Void>` を使用している場合は、準備するために null で set メソッドを呼び出します。

## AndPromise と OrPromise
<a name="advanceddatapassing.andorpromise"></a>

`AndPromise` と `OrPromise` では、複数の `Promise<>` オブジェクトを論理的な 1 つの Promise にグループ化できます。`AndPromise` は、構築に使用する Promise がすべて準備できると、準備状態になります。`OrPromise` は、構築するために使用する Promise のコレクション内の Promise が準備できたら、準備状態になります。構成要素の Promise の値のリストを取得するには、`AndPromise` および `OrPromise` で `getValues()` を呼び出すことができます。