

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

# Status alur kerja pilihan
<a name="state-choice"></a>

**Mengelola status dan mengubah data**  
Pelajari tentang [Melewati data antar status dengan variabel](workflow-variables.md) dan [Mengubah data dengan JSONata](transforming-data.md).

Sebuah `Choice` state (`"Type": "Choice"`) menambahkan logika kondisional ke mesin state.

Selain sebagian besar [bidang negara bagian umum, `Choice` negara](statemachine-structure.md#amazon-states-language-common-fields) bagian berisi bidang tambahan berikut.

**`Choices` (Wajib)**  
Array [Aturan Pilihan](#state-choice-rules) yang menentukan status mesin status yang akan ditransisikan ke berikutnya. Anda harus mendefinisikan setidaknya satu aturan di `Choice` negara bagian.  
Ketika `Choice` status dijalankan, Step Functions mengevaluasi setiap **Aturan Pilihan** menjadi benar atau salah. Berdasarkan hasilnya, Step Functions bertransisi ke status berikutnya dalam alur kerja. 

**`Default` (Opsional, Direkomendasikan)**  
Nama negara untuk transisi ke jika tidak ada **Aturan Pilihan** dievaluasi menjadi benar. 

**penting**  
 `Choice`Negara tidak mendukung `End` lapangan. Selain itu, status tersebut hanya menggunakan `Next` di dalam bidang `Choices`nya.  
Jika tidak ada **Pilihan** yang dievaluasi menjadi true saat alur kerja berjalan, dan tidak ada **Default** yang disediakan, mesin status akan memunculkan **kesalahan** *karena kegagalan transisi keluar dari status*.

## Aturan Pilihan (JSONata)
<a name="state-choice-rules"></a>

`Choice`Negara harus memiliki `Choices` bidang yang nilainya adalah larik Aturan Pilihan yang tidak kosong, yang berisi bidang berikut saat menggunakan JSONata:
+ **`Condition`field** — JSONata ekspresi yang mengevaluasi benar/salah.
+ **`Next`field** — nilai yang harus cocok dengan nama negara bagian di mesin negara.

Contoh berikut memeriksa apakah nilai numerik sama dengan `1`.

```
{
  "Condition": "{% $foo = 1 %}",
  "Next": "NumericMatchState"
}
```

Contoh berikut memeriksa apakah `type` variabel sama dengan`local`.

```
{
  "Condition": "{% $type = 'local' %}",
  "Next": "StringMatchState"
}
```

Contoh berikut memeriksa apakah string lebih besar dengan `MyStringABC`.

```
{
  "Condition": "{% $foo > 'MyStringABC' %}",
  "Next": "StringGreaterMatchState"
}
```

Contoh berikut memeriksa apakah string tidak null.

```
{
 "Condition" : "{% $possiblyNullValue != null and $possiblyNullValue = 42 %}",
 "Next": "NotNullAnd42"
}
```

## Aturan Pilihan (JSONPath)
<a name="state-choice-rules-jsonpath"></a>

`Choice`Negara harus memiliki `Choices` bidang yang nilainya adalah larik Aturan Pilihan yang tidak kosong, yang berisi bidang berikut saat menggunakan JSONPath:
+ **Perbandingan** — Dua bidang yang menentukan variabel input untuk membandingkan tipe perbandingan, dan nilai untuk membandingkan variabel. Aturan Pilihan mendukung perbandingan antara dua variabel. Dalam Aturan Pilihan, nilai variabel dapat dibandingkan dengan nilai lain dari input status dengan menambahkan nama `Path` operator perbandingan yang didukung. Nilai bidang `Variable` dan Path dalam perbandingan harus merupakan [Jalur Referensi](amazon-states-language-paths.md#amazon-states-language-reference-paths) yang valid.
+ **Bidang `Next`** — Nilai bidang ini harus cocok dengan nama status di mesin status.

Contoh berikut memeriksa apakah nilai numerik sama dengan `1`.

```
{
  "Variable": "$.foo",
  "NumericEquals": 1,
  "Next": "FirstMatchState"
}
```

Contoh berikut memeriksa apakah string sama dengan `MyString`.

```
{
  "Variable": "$.foo",
  "StringEquals": "MyString",
  "Next": "FirstMatchState"
}
```

Contoh berikut memeriksa apakah string lebih besar dengan `MyStringABC`.

```
{
  "Variable": "$.foo",
  "StringGreaterThan": "MyStringABC",
  "Next": "FirstMatchState"
}
```

Contoh berikut memeriksa apakah string bernilai null.

```
{
 "Variable": "$.possiblyNullValue",
 "IsNull": true
}
```

Contoh berikut menunjukkan bagaimana StringEquals aturan hanya dievaluasi ketika `$.keyThatMightNotExist` ada karena Aturan Pilihan sebelumnya`IsPresent`.

```
"And": [
 {
 "Variable": "$.keyThatMightNotExist",
 "IsPresent": true
 },
 {
 "Variable": "$.keyThatMightNotExist",
 "StringEquals": "foo"
 }
]
```

Contoh berikut memeriksa apakah pola dengan kecocokan wildcard.

```
{
 "Variable": "$.foo",
 "StringMatches": "log-*.txt"
}
```

Contoh berikut memeriksa apakah waktu stempel sama dengan `2001-01-01T12:00:00Z`.

```
{
  "Variable": "$.foo",
  "TimestampEquals": "2001-01-01T12:00:00Z",
  "Next": "FirstMatchState"
}
```

Contoh berikut membandingkan variabel dengan nilai lain dari input status.

```
{
 "Variable": "$.foo",
 "StringEqualsPath": "$.bar"
}
```

Step Functions meneliti masing-masing Aturan Pilihan dalam urutan yang terdaftar di bidang `Choices`. Lalu bertransisi ke status yang ditentukan di bidang `Next` Aturan Pilihan pertama saat variabel cocok dengan nilai yang sesuai dengan operator perbandingan.

Operator perbandingan berikut didukung:
+ `And`
+ `BooleanEquals`,`BooleanEqualsPath`
+ `IsBoolean`
+ `IsNull`
+ `IsNumeric`
+ `IsPresent`
+ `IsString`
+ `IsTimestamp`
+ `Not`
+ `NumericEquals`,`NumericEqualsPath`
+ `NumericGreaterThan`,`NumericGreaterThanPath`
+ `NumericGreaterThanEquals`,`NumericGreaterThanEqualsPath`
+ `NumericLessThan`,`NumericLessThanPath`
+ `NumericLessThanEquals`,`NumericLessThanEqualsPath`
+ `Or`
+ `StringEquals`,`StringEqualsPath`
+ `StringGreaterThan`,`StringGreaterThanPath`
+ `StringGreaterThanEquals`,`StringGreaterThanEqualsPath`
+ `StringLessThan`,`StringLessThanPath`
+ `StringLessThanEquals`,`StringLessThanEqualsPath`
+ `StringMatches`
+ `TimestampEquals`,`TimestampEqualsPath`
+ `TimestampGreaterThan`,`TimestampGreaterThanPath`
+ `TimestampGreaterThanEquals`,`TimestampGreaterThanEqualsPath`
+ `TimestampLessThan`,`TimestampLessThanPath`
+ `TimestampLessThanEquals`,`TimestampLessThanEqualsPath`

Untuk masing-masing operator ini, nilai yang sesuai harus dari tipe yang sesuai: string, nomor, Boolean, atau waktu stempel. Step Functions tidak mencoba untuk mencocokkan bidang numerik dengan nilai string. Namun, karena bidang waktu stempel secara logis adalah string, ada kemungkinan bahwa bidang yang dianggap sebagai stempel waktu dapat dicocokkan dengan pembanding `StringEquals`.

**catatan**  
Untuk interoperabilitas, jangan berasumsi bahwa perbandingan numerik bekerja dengan nilai di luar magnitudo atau presisi yang diwakili [tipe data `binary64` 754-2008 IEEE](https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats). Secara khusus, bilangan bulat di luar jangkauan `[-253+1, 253-1]` mungkin gagal untuk membandingkan dengan cara yang diharapkan.  
Stempel waktu (misalnya,`2016-08-18T17:33:00Z`) harus sesuai dengan [RFC3339 profil ISO 8601](https://www.ietf.org/rfc/rfc3339.txt), dengan batasan lebih lanjut:  
Huruf kapital `T` harus memisahkan bagian tanggal dan waktu.
Huruf kapital `Z` harus menunjukkan bahwa offset zona waktu numerik tidak ada.
Untuk memahami perilaku perbandingan string, lihat [Dokumentasi `compareTo` Java](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-).  
Nilai operator `And` dan `Or` harus berupa array non-kosong dari Aturan Pilihan yang tidak boleh berisi bidang `Next`. Demikian juga, nilai operator `Not` harus menjadi Aturan Pilihan tunggal yang tidak boleh mengandung bidang `Next`.  
Anda dapat membuat Aturan Pilihan yang kompleks dan di-nest menggunakan `And`, `Not`, dan `Or`. Namun, bidang `Next` hanya dapat muncul di Aturan Pilihan tingkat atas.  
Perbandingan string terhadap pola dengan satu atau lebih wildcard (“\$1”) dapat dilakukan dengan operator StringMatches perbandingan. Karakter wildcard dihilangkan menggunakan `\\ (Ex: “\\*”)` standar. Tidak ada karakter selain “\$1” yang memiliki arti khusus selama pencocokan.