

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Estado del flujo de trabajo de elección
<a name="state-choice"></a>

**Administración del estado y transformación de los datos**  
Obtenga información sobre la [Transmisión de datos entre estados con variables](workflow-variables.md) y la [Transformación de datos con JSONata](transforming-data.md).

El estado `Choice` (`"Type": "Choice"`) agrega una lógica condicional a la máquina de estado.

Además de la mayoría de los [campos de estado comunes](statemachine-structure.md#amazon-states-language-common-fields), los estados `Choice` contienen los campos adicionales que se indican a continuación.

**`Choices` (Obligatorio)**  
Matriz de [reglas de Choice](#state-choice-rules) que determina qué estado provoca que la máquina de estado adopte el siguiente estado. Debe definir al menos una regla en el estado `Choice`.  
Cuando se ejecuta un estado `Choice`, Step Functions evalúa cada **regla de Choice** como true o false. Según el resultado, Step Functions pasa al siguiente estado del flujo de trabajo. 

**`Default` (opcional, recomendado)**  
El nombre del estado al que se realizará la transición si ninguna de las **reglas de Choice** se evalúa como true. 

**importante**  
 Los estados `Choice` no admiten el campo `End`. Además, solamente utilizan `Next` dentro del campo `Choices`.  
Si ninguna opción de **Choices** se evalúa como true cuando se ejecuta el flujo de trabajo y no se proporciona ningún **valor predeterminado**, la máquina de estado generará un **error** debido a que *no se pudo realizar la transición para salir del estado*.

## Reglas de Choice (JSONata)
<a name="state-choice-rules"></a>

Un estado `Choice` debe tener un campo `Choices` cuyo valor sea una matriz no vacía de reglas de Choice, que contenga los siguientes campos cuando se utilice JSONata:
+ **`Condition`campo**: una expresión de JSonata que se evalúa como. true/false
+ **Campo `Next`**: un valor que debe coincidir con el nombre de un estado en la máquina de estado.
+ **`Assign`campo** (opcional): asigna variables cuando esta regla de elección específica coincide. Cada regla de elección puede tener su propio `Assign` bloque, lo que permite establecer diferentes variables en función de la ruta que se tome. También puede especificar un `Assign` bloque a nivel estatal, que se aplica independientemente de la regla de elección que coincida.

En el ejemplo siguiente, se comprueba si el valor numérico es igual a `1`.

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

En el ejemplo siguiente se comprueba si la variable `type` es igual a `local`.

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

En el ejemplo siguiente, se comprueba si la cadena es mayor que `MyStringABC`.

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

En el ejemplo siguiente se comprueba si la cadena no tiene un valor null.

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

El siguiente ejemplo muestra un `Choice` estado con `Assign` bloques por regla que establecen diferentes variables en función de la condición coincidente:

```
{
  "Type": "Choice",
  "Choices": [
    {
      "Condition": "{% $states.input.category = 'premium' %}",
      "Next": "PremiumPath",
      "Assign": {
        "discount": 20
      }
    },
    {
      "Condition": "{% $states.input.category = 'standard' %}",
      "Next": "StandardPath",
      "Assign": {
        "discount": 5
      }
    }
  ],
  "Default": "DefaultPath",
  "Assign": {
    "discount": 0
  }
}
```

## Uso de los estados Assign with Choice
<a name="state-choice-assign"></a>

Puede utilizar el `Assign` campo en dos niveles en un estado de elección:
+ **Nivel superior**: se define directamente en el estado de elección, fuera de cualquier regla de elección.
+ **Dentro de una regla de elección**: se define dentro de una regla individual de la `Choices` matriz.

Estas dos ubicaciones se excluyen mutuamente en tiempo de ejecución. Si una regla de elección coincide, Step Functions evalúa solo el `Assign` campo de esa regla y no evalúa el campo de nivel superior`Assign`. Step Functions evalúa el nivel superior `Assign` solo cuando no coincide ninguna regla de elección y el flujo de trabajo pasa al `Default` estado.

En el siguiente ejemplo, se muestran ambas ubicaciones.

```
{
  "Type": "Choice",
  "Assign": {
    "outputValue": "{% 'default path taken' %}"
  },
  "Choices": [
    {
      "Condition": "{% $score > 90 %}",
      "Assign": {
        "outputValue": "{% 'high score' %}"
      },
      "Next": "HighScoreState"
    },
    {
      "Condition": "{% $score > 50 %}",
      "Next": "MediumScoreState"
    }
  ],
  "Default": "LowScoreState"
}
```

En este ejemplo, si `$score` es mayor que 90, Step Functions asigna `outputValue` `"high score"` y realiza transiciones a`HighScoreState`. El nivel superior no `Assign` se evalúa. Si ninguna regla coincide, Step Functions evalúa el nivel superior `Assign` y pasa a él. `LowScoreState`

## Reglas de Choice (JSONPath)
<a name="state-choice-rules-jsonpath"></a>

Un estado `Choice` debe tener un campo `Choices` cuyo valor sea una matriz no vacía de reglas de Choice, que contenga los siguientes campos cuando se utilice JSONPath:
+ Una **comparación**: dos campos que especifican la variable de entrada que se va a comparar, el tipo de comparación y el valor con el que se va a comparar la variable de entrada. Las reglas de Choice permiten la comparación entre dos variables. Dentro de una regla de Choice, el valor de la variable se puede comparar con otro valor de la entrada de estado añadiendo `Path` al nombre de los operadores de comparación compatibles. Los valores de los campos `Variable` y Ruta de una comparación deben ser [rutas de referencia](amazon-states-language-paths.md#amazon-states-language-reference-paths) válidas.
+ Un **campo `Next`**: el valor de este campo debe coincidir con el nombre del estado en que se encuentra la máquina de estado.

En el ejemplo siguiente, se comprueba si el valor numérico es igual a `1`.

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

En el ejemplo siguiente, se comprueba si la cadena es igual a `MyString`.

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

En el ejemplo siguiente, se comprueba si la cadena es mayor que `MyStringABC`.

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

En el ejemplo siguiente, se comprueba si la cadena es nula.

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

El siguiente ejemplo muestra cómo la StringEquals regla solo se evalúa cuando `$.keyThatMightNotExist` existe debido a la regla de `IsPresent` elección anterior.

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

En el ejemplo siguiente, se comprueba si un patrón coincide con un comodín.

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

En el ejemplo siguiente, se comprueba si la marca de tiempo es igual a `2001-01-01T12:00:00Z`.

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

En el ejemplo siguiente, se compara una variable con otro valor de la entrada de estado.

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

Step Functions examina cada una de las reglas de Choice en el orden en el que aparecen en el campo `Choices`. A continuación, adopta el estado especificado en el campo `Next` de la primera regla de Choice en la que la variable coincide con el valor que corresponde al operador de comparación.

Se admiten los siguientes operadores de comparación:
+ `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`

En cada uno de estos operadores, el valor correspondiente debe ser del tipo adecuado: cadena, número, booleano o marca de tiempo. Step Functions no intenta asociar un campo numérico con un valor de cadena. Sin embargo, como los campos de marca de tiempo son cadenas, es posible que un campo que se considera una marca de tiempo cumpla una condición establecida con un comparador `StringEquals`.

**nota**  
Por motivos de interoperabilidad, no presuponga que las comparaciones numéricas funcionan con valores que están fuera del rango de magnitud o precisión que [el tipo de datos `binary64` de IEEE 754-2008](https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats) representa. En particular, es posible que los enteros que están fuera del rango `[-253+1, 253-1]` no puedan compararse del modo esperado.  
Las marcas de tiempo (por ejemplo, `2016-08-18T17:33:00Z`) deben ajustarse al [perfil RFC3339 de ISO 8601](https://www.ietf.org/rfc/rfc3339.txt), con restricciones adicionales:  
Las partes de fecha y hora deben separarse con una letra `T` mayúscula.
Debe utilizarse una letra `Z` mayúscula para indicar que no se aplica ningún ajuste numérico de zona horaria.
Para comprender el comportamiento de comparación de cadenas, consulte la [documentación de Java `compareTo`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-).  
Los valores de los operadores `And` y `Or` deben ser matrices de reglas de Choice que no estén vacías y que no contengan campos `Next`. Del mismo modo, el valor de un operador `Not` tiene que ser una única regla de Choice que no debe contener campos `Next`.  
Puede crear reglas de Choice anidadas y complejas utilizando `And`, `Not` y `Or`. Sin embargo, el campo `Next` solamente puede aparecer en las reglas de Choice de nivel superior.  
La comparación de cadenas con patrones con uno o más caracteres comodín («\*») se puede realizar con el operador de StringMatches comparación. Se aplica escape al carácter comodín de manera estándar con `\\ (Ex: “\\*”)`. Ningún otro carácter que no sea “\*” tiene un significado especial para la coincidencia.