

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

# Melewati data antar negara bagian dengan variabel
<a name="workflow-variables"></a>

**Mengelola status dengan variabel dan JSONata**  
Step Functions baru-baru ini menambahkan variabel dan JSONata untuk mengelola status dan mengubah data.  
Pelajari lebih lanjut di posting blog [Menyederhanakan pengalaman pengembang dengan variabel dan JSONata ](https://aws.amazon.com/blogs/compute/simplifying-developer-experience-with-variables-and-jsonata-in-aws-step-functions/) di AWS Step Functions  
 Video berikut menjelaskan variabel dan JSONata dalam Step Functions dengan contoh DynamoDB:   




 Dengan variabel dan output status, Anda dapat meneruskan data di antara langkah-langkah alur kerja Anda. 

 Dengan menggunakan variabel alur kerja, Anda dapat menyimpan data dalam satu langkah dan mengambil data tersebut di langkah masa depan. Misalnya, Anda dapat menyimpan respons API yang berisi data yang mungkin Anda perlukan nanti. Sebaliknya, output status hanya dapat digunakan sebagai masukan ke langkah berikutnya. 

## Tinjauan konseptual variabel
<a name="conceptual-overview-of-variables"></a>

 Dengan variabel alur kerja, Anda dapat menyimpan data untuk referensi nanti. Misalnya, Langkah 1 mungkin menyimpan hasil dari permintaan API sehingga bagian dari permintaan itu dapat digunakan kembali nanti di Langkah 5. 

 Dalam skenario berikut, mesin status mengambil data dari API sekali. Pada Langkah 1, alur kerja menyimpan data API yang dikembalikan (hingga 256 KiB per status) dalam variabel 'x' untuk digunakan dalam langkah selanjutnya. 

 Tanpa variabel, Anda harus meneruskan data melalui output dari Langkah 1 ke Langkah 2 ke Langkah 3 ke Langkah 4 untuk menggunakannya di Langkah 5. Bagaimana jika langkah-langkah perantara itu tidak membutuhkan data? Meneruskan data dari negara ke negara melalui output dan input akan menjadi upaya yang tidak perlu. 

 Dengan variabel, Anda dapat menyimpan data dan menggunakannya di setiap langkah masa depan. Anda juga dapat memodifikasi, mengatur ulang, atau menambahkan langkah-langkah tanpa mengganggu aliran data Anda. Mengingat fleksibilitas variabel, Anda mungkin hanya perlu menggunakan **Output** untuk mengembalikan data dari sub-alur kerja Paralel dan Peta, dan di akhir eksekusi mesin status Anda. 

 ![\[Diagram showing step 1 assigning a value to $x, used in step 5.\]](http://docs.aws.amazon.com/id_id/step-functions/latest/dg/images/vars-diag-opt1.png)

 **Menyatakan yang mendukung variabel**

 Jenis status berikut mendukung `Assign` untuk mendeklarasikan dan menetapkan nilai ke variabel: *Lulus, Tugas, Peta, Paralel, Pilihan, Tunggu*.

 Untuk mengatur variabel, berikan objek JSON dengan nama dan nilai variabel: 

```
"Assign": {
  "productName": "product1",
  "count" : 42,
  "available" : true
}
```

 Untuk mereferensikan variabel, tambahkan nama dengan tanda dolar (`$`), misalnya,. `$productName` 

## Variabel yang dicadangkan: \$1 negara
<a name="reserved-variable-states"></a>

 Step Functions mendefinisikan variabel cadangan tunggal yang disebut **`$states`**. Di JSONata negara bagian, struktur berikut ditugaskan `$states` untuk digunakan dalam JSONata ekspresi: 

```
# Reserved $states variable in JSONata states
$states = {
  "input":       // Original input to the state
  "result":      // API or sub-workflow's result (if successful)
  "errorOutput": // Error Output (only available in a Catch)
  "context":     // Context object
}
```

 Pada entri status, Step Functions menetapkan input status ke **`$states.input`**. Nilai `$states.input` dapat digunakan di semua bidang yang menerima JSONata ekspresi. `$states.input`selalu mengacu pada input status asli. 

 Untuk`Task`,`Parallel`, dan `Map` menyatakan:
+ **`$states.result`**mengacu pada hasil mentah API atau sub-alur kerja jika berhasil. 
+ **`$states.errorOutput`**mengacu pada Output Kesalahan jika API atau sub-alur kerja gagal.

  `$states.errorOutput`dapat digunakan di `Catch` lapangan `Assign` atau`Output`. 

Mencoba mengakses `$states.result` atau `$states.errorOutput` di bidang dan status di mana mereka tidak dapat diakses akan tertangkap saat pembuatan, pembaruan, atau validasi mesin status. 

`$states.context`Objek memberikan informasi alur kerja Anda tentang eksekusi spesifik mereka, seperti, token tugas`StartTime`, dan input alur kerja awal. Untuk mempelajari selengkapnya, lihat [Mengakses data eksekusi dari objek Context di Step Functions](input-output-contextobject.md).

## Sintaks nama variabel
<a name="variable-name-syntax"></a>

 Nama variabel mengikuti aturan untuk Pengidentifikasi Unicode seperti yang dijelaskan dalam [Unicode® Standard](https://unicode.org/reports/tr31/) Annex \$131. Karakter pertama dari nama variabel harus karakter Unicode ID\$1Start, dan karakter kedua dan selanjutnya harus karakter Unicode ID\$1continue. Panjang maksimum nama variabel adalah 80. 

 Konvensi nama variabel mirip dengan aturan untuk JavaScript dan bahasa pemrograman lainnya. 

## Lingkup variabel
<a name="variable-scope"></a>

 Alur kerja Step Functions menghindari kondisi balapan dengan variabel dengan menggunakan lingkup *workflow-local*. 

Lingkup workflow-local mencakup semua status di dalam bidang States mesin status, tetapi tidak **status** di dalam status Paralel atau Peta. Status di dalam status Paralel atau Peta dapat merujuk ke variabel lingkup luar, tetapi mereka membuat dan memelihara variabel dan nilai alur kerja-lokal mereka sendiri yang terpisah.

`Parallel`cabang dan `Map` iterasi dapat mengakses nilai variabel dari **lingkup luar**, tetapi mereka tidak memiliki akses ke nilai variabel dari cabang atau iterasi bersamaan lainnya. Saat menangani kesalahan, `Assign` bidang dalam a `Catch` dapat menetapkan nilai ke variabel di lingkup luar, yaitu ruang lingkup di mana Parallel/Map status ada.

 Pengecualian: **Status Peta Terdistribusi** saat ini tidak dapat mereferensikan variabel di lingkup luar. 

 Variabel ada dalam lingkup jika ada negara bagian dalam lingkup yang memberikan nilai padanya. Untuk membantu menghindari kesalahan umum, variabel yang ditetapkan dalam lingkup dalam tidak dapat memiliki nama yang sama dengan yang ditetapkan dalam lingkup luar. Misalnya, jika lingkup tingkat atas memberikan nilai ke variabel yang dipanggil`myVariable`, maka tidak ada lingkup lain (di dalam`Map`,`Parallel`) yang dapat menetapkan juga. `myVariable` 

 Akses ke variabel tergantung pada ruang lingkup saat ini. Status Paralel dan Peta memiliki cakupannya sendiri, tetapi dapat mengakses variabel dalam lingkup luar. 

 Ketika status Paralel atau Peta selesai, semua variabelnya akan keluar dari cakupan dan berhenti dapat diakses. Gunakan **bidang Output** untuk meneruskan data dari cabang Paralel dan iterasi Peta. 

## Tetapkan bidang di ASL
<a name="assign-field-in-asl"></a>

 `Assign`Bidang di ASL digunakan untuk menetapkan nilai ke satu atau lebih variabel. `Assign`Bidang ini tersedia di tingkat atas setiap negara bagian (kecuali `Succeed` dan`Fail`), di dalam aturan `Choice` negara bagian, dan di dalam `Catch` bidang. Misalnya: 

```
# Example of Assign with JSONata
"Store inputs": {
    "Type": "Pass",
    "Next": "Get Current Price",
    "Comment": "Store the input desired price into a variable: $desiredPrice",
    "Assign": {
       "desiredPrice": "{% $states.input.desired_price %}",
       "maximumWait": "{% $states.input.max_days %}"
    }
},
```

 `Assign`Bidang mengambil objek JSON. Setiap bidang tingkat atas memberi nama variabel untuk ditetapkan. Pada contoh sebelumnya, nama variabel adalah `desiredPrice` dan`maximumWait`. Saat menggunakan JSONata, `{% ... %}` menunjukkan JSONata ekspresi yang mungkin berisi variabel atau ekspresi yang lebih kompleks. Untuk informasi lebih lanjut tentang JSONata ekspresi, lihat [JSONatadokumentasi.org](https://docs.jsonata.org/overview.html). 

 Saat menggunakan **JSONata**sebagai bahasa query, diagram berikut menunjukkan bagaimana bidang **Assign** dan **Output** diproses secara paralel. Perhatikan implikasinya: *menetapkan nilai variabel tidak akan mempengaruhi keadaan* Output.

 ![\[Diagram showing a comparison of JSONPath and JSONata flow.\]](http://docs.aws.amazon.com/id_id/step-functions/latest/dg/images/vars-jsonata.png)

 JSONata Contoh berikut mengambil `order.product` dari input status. Variabel `currentPrice` diatur ke nilai dari hasil tugas. 

```
# Example of Task with JSONata assignment from result
{
   "Type": "Task",
   ...
   "Assign": {
      "product": "{% $states.input.order.product %}",
      "currentPrice": "{% $states.result.Payload.current_price %}"
   },
   "Next": "the next state"
}
```

 Catatan: Anda **tidak dapat** menetapkan nilai ke bagian dari variabel. Misalnya, Anda bisa`"Assign":{"x":42}`, tetapi Anda tidak bisa `"Assign":{"x.y":42}` atau`"Assign":{"x[2]":42}`. 

## Urutan evaluasi di bidang penetapan
<a name="evaluation-order-in-an-assign-field"></a>

Semua referensi variabel dalam status Step Functions menggunakan nilai seperti pada **entri status**. 

Fakta sebelumnya penting untuk memahami bagaimana `Assign` bidang memberikan nilai ke satu atau lebih variabel. Pertama, nilai baru dihitung, kemudian Step Functions menetapkan nilai baru ke variabel. Nilai variabel baru akan tersedia dimulai dengan status **berikutnya**. Misalnya, perhatikan `Assign` bidang berikut: 

```
# Starting values: $x=3, $a=6

"Assign": {
  "x": "{% $a %}",
  "nextX": "{% $x %}"
}

# Ending values: $x=6, $nextX=3
```

Dalam contoh sebelumnya, variabel ditugaskan dan `x` direferensikan. 

Ingat, semua ekspresi ***dievaluasi terlebih dahulu***, kemudian tugas dibuat. Dan nilai yang baru ditetapkan akan tersedia di negara bagian **berikutnya**. 

Mari kita lihat contoh secara rinci. Asumsikan bahwa dalam keadaan sebelumnya, `$x` diberi nilai tiga (3) dan `$a` diberi nilai enam (6). Langkah-langkah berikut menjelaskan proses:

1. Semua ekspresi dievaluasi, menggunakan nilai **saat ini** dari semua variabel.

   Ekspresi `"{% $a %}"` akan mengevaluasi ke 6, dan `"{% $x %}"` akan mengevaluasi ke 3.

1. Selanjutnya, tugas dibuat:

   `$x`akan diberi nilai enam (6) 

   `$nextX`akan diberikan tiga (3)

 Catatan: Jika `$x` sebelumnya tidak ditetapkan, contoh akan **gagal** karena `$x` *tidak terdefinisi*. 

 Singkatnya, Step Functions mengevaluasi **semua** ekspresi dan kemudian membuat tugas. Urutan terjadinya variabel di `Assign` lapangan **tidak** masalah. 

## Batas
<a name="limits"></a>

 Ukuran maksimum variabel tunggal adalah 256Kib, untuk alur kerja Standar dan Ekspres. 

 Ukuran gabungan maksimum untuk semua variabel dalam satu `Assign` bidang juga 256Kib. Misalnya, Anda dapat menetapkan X dan Y ke 128KiB, tetapi Anda tidak dapat menetapkan X dan Y ke 256KiB di bidang yang sama. `Assign` 

 Ukuran total semua variabel yang disimpan tidak dapat melebihi 10MiB per eksekusi. 

## Menggunakan variabel di JSONPath negara bagian
<a name="using-variables-in-jsonpath-states"></a>

 Variabel juga tersedia di negara bagian yang digunakan JSONPath untuk bahasa kueri mereka. 

 Anda dapat mereferensikan variabel di bidang apa pun yang menerima JSONpath ekspresi (`$.`atau `$$.` sintaks), dengan pengecualian`ResultPath`, yang menentukan lokasi dalam input status untuk menyuntikkan hasil status. Variabel tidak dapat digunakan dalam`ResultPath`. 

 Dalam JSONPath, `$` simbol mengacu pada nilai 'saat ini' dan `$$` mewakili status objek Konteks. JSONPath ekspresi dapat dimulai dengan `$.` as in`$.customer.name`. Anda dapat mengakses konteks dengan `$$.` as in`$$.Execution.Id`. 

 Untuk referensi variabel, Anda juga menggunakan `$` simbol sebelum nama variabel, misalnya, `$x` atau`$order.numItems`. 

 Di ** JSONPath**bidang yang menerima fungsi intrinsik, variabel dapat digunakan dalam argumen, misalnya. `States.Format('The order number is {}', $order.number)` 

 Digram berikut menggambarkan bagaimana langkah penetapan dalam **JSONPath**tugas terjadi pada saat yang sama dengan: ResultSelector 

 ![\[Logical diagram of a state that uses JSONPath query language.\]](http://docs.aws.amazon.com/id_id/step-functions/latest/dg/images/vars-jsonpath.png)

 **Menetapkan variabel di JSONPath**

 JSONPath tugas variabel berperilaku mirip dengan template payload. Bidang yang diakhiri dengan `.$` menunjukkan nilai adalah JSONPath ekspresi yang dievaluasi Step Functions ke nilai selama eksekusi mesin status (misalnya: `$.order..product` dan`$.order.total`). 

```
# Example of Assign with JSONPath
{
  "Type": "Task",
  ...
  "Assign": {
    "products.$": "$.order..product",
    "orderTotal.$": "$.order.total"
  },
  "Next": "the next state"
}
```

 Untuk JSONPath negara bagian, nilai `$` dalam `Assign` bidang tergantung pada jenis status. Dalam `Task,``Map`, `Parallel` menyatakan, `$` mengacu pada hasil API/Sub-alur kerja. In `Choice` and `Wait` state, `$` mengacu pada *input efektif*, yang merupakan nilai `InputPath` setelah diterapkan pada input status. Untuk`Pass`, `$` mengacu pada hasil, apakah yang dihasilkan oleh `Result` bidang atau `Parameters` bidang`InputPath`/. 

 JSONPath Contoh berikut menetapkan objek JSON ke `details` variabel, hasil JSONPath ekspresi `$.result.code` ke`resultCode`, dan hasil JSONPath ekspresi `States.Format('Hello {}', $customer.name)` untuk. `message` Jika ini dalam `Task` keadaan, maka `$` masuk `$.order.items` dan `$.result.code` mengacu pada hasil API. `startTime`Variabel diberikan dengan nilai dari objek Context,`$$.Execution.StartTime`. 

```
"Assign": {
   "details": {
      "status": "SUCCESS",
      "lineItems.$": "$.order.items"
   },
   "resultCode.$": "$.result.code",
   "message.$": "States.Format('Hello {}', $customer.name)",
   "startTime.$": "$$.Execution.StartTime"
}
```