

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Meneruskan Data ke Metode Asinkron
<a name="advanceddatapassing"></a>

**Topics**
+ [Meneruskan Koleksi dan Maps ke Metode Asinkron](#advanceddatapassing.collections)
+ [Dapat diatur <T>](#advanceddatapassing.settable)
+ [@NoWait](#advanceddatapassing.nowait)
+ [Janji <Void>](#advanceddatapassing.promise)
+ [AndPromise dan OrPromise](#advanceddatapassing.andorpromise)

Penggunaan `Promise<{{T}}>` telah dijelaskan di bagian sebelumnya. Beberapa kasus penggunaan `Promise<{{T}}>` lanjutan dibahas di sini.

## Meneruskan Koleksi dan Maps ke Metode Asinkron
<a name="advanceddatapassing.collections"></a>

Kerangka ini mendukung meneruskan array, koleksi, dan peta sebagai jenis `Promise` metode asinkron. Sebagai contoh, metode asinkron dapat mengambil `Promise<ArrayList<String>>` sebagai argumen seperti yang ditunjukkan dalam daftar berikut.

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

Secara semantik, ini berperilaku seperti parameter `Promise` lain yang diketik dan metode asinkron akan menunggu hingga koleksi tersedia sebelum dieksekusi. Jika anggota koleksi adalah objek `Promise`, maka anda bisa membuat framework menunggu semua member siap seperti terlihat pada cuplikan berikut. Ini akan membuat metode asinkron menunggu pada setiap anggota koleksi untuk menjadi tersedia.

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

 Perhatikan bahwa anotasi `@Wait` harus digunakan pada parameter untuk menunjukkan bahwa itu berisi Objek `Promise`. 

 Perhatikan juga bahwa aktivitas `printActivity` mengambil argumen `String` tetapi metode yang dihasilkan menggunakan Promise<String>. Kami memanggil metode pada klien dan tidak memanggil metode aktivitas secara langsung. 

## Dapat diatur <T>
<a name="advanceddatapassing.settable"></a>

`Settable<{{T}}>` adalah jenis turunan dari `Promise<T>` yang menyediakan satu set metode yang memungkinkan Anda untuk secara manual mengatur nilai `Promise`. Sebagai contoh, alur kerja berikut menunggu sinyal yang akan diterima dengan menunggu `Settable<?>`, yang diatur dalam metode sinyal:

```
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;
   }
}
```

Sebuah `Settable<?>` juga dapat dirantai ke janji lain pada suatu waktu. Anda dapat menggunakan `AndPromise` dan `OrPromise` untuk janji kelompok. Anda dapat melepaskan rantai `Settable` yang dirantai dengan memanggil metode `unchain()` di atasnya. Ketika dirantai, `Settable<?>` secara otomatis menjadi siap ketika janji yang dirantai menjadi siap. Perangkaian sangat berguna ketika Anda ingin menggunakan janji yang dikembalikan dari dalam lingkup `doTry()` di bagian lain dari program Anda. Karena `TryCatchFinally` digunakan sebagai kelas bersarang, Anda tidak dapat mendeklarasikan a `Promise<>` dalam lingkup induk dan mengaturnya. `doTry()` Hal ini karena Java membutuhkan variabel yang akan dinyatakan dalam lingkup induk dan digunakan dalam kelas bersarang untuk ditandai sebagai akhir. Sebagai contoh:

```
@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;
}
```

Sebuah `Settable` dapat dirantai ke satu janji pada satu waktu. Anda dapat melepaskan rantai `Settable` yang dirantai dengan memanggil metode `unchain()` di atasnya.

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

Ketika Anda meneruskan `Promise` ke metode asinkron, secara default, kerangka kerja akan menunggu `Promise` untuk menjadi siap sebelum mengeksekusi metode (kecuali untuk jenis koleksi). Anda dapat mengganti perilaku ini dengan menggunakan anotasi `@NoWait` pada parameter dalam deklarasi metode asinkron. Ini berguna jika Anda meneruskan di `Settable<T>`, yang akan ditetapkan oleh metode asinkron itu sendiri.

## Janji <Void>
<a name="advanceddatapassing.promise"></a>

Dependensi dalam metode asinkron diimplementasikan dengan meneruskan `Promise` yang dikembalikan oleh satu metode sebagai argumen yang lain. Namun, mungkin ada kasus di mana Anda ingin mengembalikan `void` dari sebuah metode, tetapi masih ingin metode asinkron lainnya dijalankan setelah selesai. Dalam kasus seperti itu, Anda bisa menggunakan `Promise<Void>` sebagai tipe pengembalian metode. Kelas `Promise` menyediakan metode `Void` statis yang dapat Anda gunakan untuk membuat objek `Promise<Void>`. `Promise` Ini akan menjadi siap ketika metode asinkron selesai dijalankan. Anda bisa meneruskan `Promise` ini ke metode asinkron lain seperti objek `Promise` yang lain. Jika Anda menggunakan `Settable<Void>`, panggil metode set di atasnya dengan null untuk membuatnya siap.

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

`AndPromise` dan `OrPromise` memungkinkan Anda untuk mengelompokkan beberapa objek `Promise<>` menjadi janji logis tunggal. `AndPromise` menjadi siap ketika semua janji yang digunakan untuk membangunnya siap. `OrPromise` menjadi siap ketika janji dalam koleksi janji yang digunakan untuk membangunnya siap. Anda dapat menelepon `getValues()` pada `AndPromise` dan `OrPromise` untuk mengambil daftar nilai dari janji konstituen.