控制工作流中的执行顺序

本页面介绍如何使用跳转或 for 循环来控制工作流步骤的运行顺序。基本跳转允许您定义工作流下一步运行的步骤。条件跳转操作基于基本跳转构建,允许您使用条件表达式来控制工作流中的执行顺序。例如,只有在另一个工作流步骤的变量或响应满足特定条件时,您才能运行某些步骤。

本页面上的示例使用的示例 API 会返回一周中的某一天。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 您应该已经有一个要在其中更改执行顺序的现有工作流。如需了解如何创建和部署工作流,请参阅创建和更新工作流

使用跳转操作更改执行顺序

默认情况下,所有工作流都会进行排序,其中每个步骤都按您在工作流的源代码中定义的顺序运行。您可以选择使用跳转操作替换此默认顺序。

基本跳转操作

您可以使用基本跳转操作,指定要在工作流中运行的下一步。

控制台

  1. 在 Google Cloud 控制台中打开“Workflows”页面:
    转到“Workflows”

  2. 选择您要在其中更改现有步骤执行顺序的工作流的名称。

  3. 修改工作流页面上,选择下一步以转到工作流编辑器。

  4. 在步骤结尾添加 next 字段,以指示工作流跳转到特定步骤:

    YAML

         - step_a:
             ...
             next: STEP_NAME_TO_JUMP_TO
         - step_b:
             ...
         - next_step:
             ...

    JSON

        [
          {
            "step_a": {
              ...
              "next": "STEP_NAME_TO_JUMP_TO"
            }
          }
          {
            "step_b": {
              ...
            }
          }
          {
            "next_step": {
              ...
            }
          }
        ]

    STEP_NAME_TO_JUMP_TO 替换为您希望工作流接下来执行的步骤的名称。例如:next_step

  5. 选择部署

gcloud

  1. 在您选择的文本编辑器中打开工作流的定义文件。

  2. 在步骤结尾添加 next 字段,以指示工作流跳转到特定步骤:

    YAML

         - step_a:
             ...
             next: STEP_NAME_TO_JUMP_TO
         - step_b:
             ...
         - next_step:
             ...

    JSON

      [
        {
          "step_a": {
            ...
            "next": "STEP_NAME_TO_JUMP_TO"
          }
        }
        {
          "step_b": {
            ...
          }
        }
        {
          "next_step": {
            ...
          }
        }
      ]

    STEP_NAME_TO_JUMP_TO 替换为您希望工作流接下来执行的步骤的名称。例如 next_step

  3. 保存工作流文件。

  4. 要部署工作流,请输入以下命令:

    gcloud workflows deploy WORKFLOW_NAME \
    --source=WORKFLOW_FILE.YAML
    

    替换以下内容:

    • WORKFLOW_NAME:必填。工作流的名称。

    • WORKFLOW_FILE.YAML:必填。工作流的源文件。

示例

例如,以下工作流的步骤顺序混乱:

YAML

  - get_time:
     call: http.get
     args:
         url:  https://us-central1-workflowsample.cloudfunctions.net/datetime
     result: currentTime
  - return_daylight_savings_bool:
     return: ${daylightSavings}
  - get_daylight_savings_bool:
     assign:
         - daylightSavings: ${currentTime.body.isDayLightSavingsTime}

JSON

    [
      {
        "get_time": {
          "call": "http.get",
          "args": {
            "url": "https://us-central1-workflowsample.cloudfunctions.net/datetime"
          },
          "result": "currentTime"
        }
      },
      {
        "return_daylight_savings_bool": {
          "return": "${daylightSavings}"
        }
      },
      {
        "get_daylight_savings_bool": {
          "assign": [
            {
              "daylightSavings": "${currentTime.body.isDayLightSavingsTime}"
            }
          ]
        }
      }
    ]

在此示例中,next 字段已添加到 get_daylight_savings_boolreturn_daylight_savings_bool 步骤,以使步骤按正确的顺序执行:

YAML

  - get_time:
     call: http.get
     args:
         url:  https://us-central1-workflowsample.cloudfunctions.net/datetime
     result: currentTime
     next: get_daylight_savings_bool
  - return_daylight_savings_bool:
     return: ${daylightSavings}
  - get_daylight_savings_bool:
     assign:
         - daylightSavings: ${currentTime.body.isDayLightSavingsTime}
     next: return_daylight_savings_bool

JSON

    [
      {
        "get_time": {
          "call": "http.get",
          "args": {
            "url": "https://us-central1-workflowsample.cloudfunctions.net/datetime"
          },
          "result": "currentTime",
          "next": "get_daylight_savings_bool"
        }
      },
      {
        "return_daylight_savings_bool": {
          "return": "${daylightSavings}"
        }
      },
      {
        "get_daylight_savings_bool": {
          "assign": [
            {
              "daylightSavings": "${currentTime.body.isDayLightSavingsTime}"
            }
          ],
          "next": "return_daylight_savings_bool"
        }
      }
    ]

条件跳转操作

您可以使用条件跳转操作来确定要在工作流中执行的下一步。条件跳转操作使用 switch 块,如果满足特定条件,则跳转到指定步骤。每个 switch 块最多可以包含 50 个条件。

控制台

  1. 在 Google Cloud 控制台中打开“Workflows”页面:
    转到“Workflows”

  2. 选择要添加 switch 块的工作流的名称。

  3. 修改工作流页面上,选择下一步以转到工作流编辑器。

  4. 定义工作流页面上将显示工作流的当前定义。如需修改工作流,使其根据条件语句执行特定步骤,请添加使用 switch 块的步骤:

    YAML

         - SWITCH_STEP_NAME:
             switch:
                 - condition: ${EXPRESSION_ONE}
                   next: STEP_A
                 - condition: ${EXPRESSION_TWO}
                   next: STEP_B
                 ...
             next: STEP_C
         - STEP_A
             ...
         - STEP_B
             ...
         - STEP_C
             ...

    JSON

        [
          {
            "SWITCH_STEP_NAME": {
              "switch": [
                {
                  "condition": "${EXPRESSION_ONE}",
                  "next": "STEP_A"
                },
                {
                  "condition": "${EXPRESSION_TWO}",
                  "next": "STEP_B"
                }
              ],
              "next": "STEP_C"
            }
            "STEP_A": {
              ...
            }
            "STEP_B": {
              ...
            }
            "STEP_C": {
              ...
            }
          }
        ]

    替换以下内容:

    • SWITCH_STEP_NAME:包含 switch 块的步骤名称。

    • EXPRESSION_ONE:要评估的第一个表达式。如果此表达式的计算结果为 true,工作流接下来会执行 STEP_A。如果此表达式的计算结果为 false,则工作流将评估下一个表达式。

    • EXPRESSION_TWO:要评估的第二个表达式。如果此表达式的计算结果为 true,工作流接下来会执行 STEP_B。如果此表达式的计算结果为 false,则工作流执行 STEP_C

    • STEP_ASTEP_BSTEP_C:占位符步骤名称。

  5. 选择部署

gcloud

  1. 在您选择的文本编辑器中打开工作流的定义。

  2. 如需修改工作流,使其根据条件语句执行特定步骤,请添加使用 switch 块的步骤:

    YAML

     - SWITCH_STEP_NAME:
         switch:
             - condition: ${EXPRESSION_ONE}
               next: STEP_A
             - condition: ${EXPRESSION_TWO}
               next: STEP_B
             ...
         next: STEP_C
     - STEP_A
         ...
     - STEP_B
         ...
     - STEP_C
         ...
    

    JSON

    [
      {
        "SWITCH_STEP_NAME": {
          "switch": [
            {
              "condition": "${EXPRESSION_ONE}",
              "next": "STEP_A"
            },
            {
              "condition": "${EXPRESSION_TWO}",
              "next": "STEP_B"
            }
          ],
          "next": "STEP_C"
        }
        "STEP_A": {
          ...
        }
        "STEP_B": {
          ...
        }
        "STEP_C": {
          ...
        }
      }
    ]
      

    替换以下内容:

    • SWITCH_STEP_NAME:包含 switch 块的步骤名称。

    • EXPRESSION_ONE:要评估的第一个表达式。如果此表达式的计算结果为 true,工作流接下来会执行 STEP_A。如果此表达式的计算结果为 false,则工作流将评估下一个表达式。

    • EXPRESSION_TWO:要评估的第二个表达式。如果此表达式的计算结果为 true,工作流接下来会执行 STEP_B。如果此表达式的计算结果为 false,则工作流执行 STEP_C

    • STEP_ASTEP_BSTEP_C:占位符步骤名称。

  3. 保存工作流文件。

  4. 要部署工作流,请输入以下命令:

    gcloud workflows deploy WORKFLOW_NAME \
    --source=WORKFLOW_FILE.YAML
    

    替换以下内容:

    • WORKFLOW_NAME:必填。工作流的名称。

    • WORKFLOW_FILE.YAML:必填。工作流的源文件。

示例

例如,以下工作流使用切换块来控制工作流的执行顺序:

YAML

  - getCurrentTime:
      call: http.get
      args:
          url:  https://us-central1-workflowsample.cloudfunctions.net/datetime
      result: currentTime
  - conditionalSwitch:
      switch:
          - condition: ${currentTime.body.dayOfTheWeek == "Friday"}
            next: friday
          - condition: ${currentTime.body.dayOfTheWeek == "Saturday" OR currentTime.body.dayOfTheWeek == "Sunday"}
            next: weekend
      next: workWeek
  - friday:
      return: "It's Friday! Almost the weekend!"
  - weekend:
      return: "It's the weekend!"
  - workWeek:
      return: "It's the work week."
    

JSON

    [
      {
        "getCurrentTime": {
          "call": "http.get",
          "args": {
            "url": "https://us-central1-workflowsample.cloudfunctions.net/datetime"
          },
          "result": "currentTime"
        }
      },
      {
        "conditionalSwitch": {
          "switch": [
            {
              "condition": "${currentTime.body.dayOfTheWeek == "Friday"}",
              "next": "friday"
            },
            {
              "condition": "${currentTime.body.dayOfTheWeek == "Saturday" OR currentTime.body.dayOfTheWeek == "Sunday"}",
              "next": "weekend"
            }
          ],
          "next": "workWeek"
        }
      },
      {
        "friday": {
          "return": "It's Friday! Almost the weekend!"
        }
      },
      {
        "weekend": {
          "return": "It's the weekend!"
        }
      },
      {
        "workWeek": {
          "return": "It's the work week."
        }
      }
    ]
      

在此示例中,switch 块有两个条件。解析器按顺序对每个条件求值,如果条件表达式的结果为 true,则调用该条件的 next 步骤。如果不满足任何条件,工作流将调用 switch 块外部的 next 字段指定的步骤,在本例中为步骤 workWeek

例如,如果星期几为 "Saturday",则工作流会跳转至步骤 weekend 并返回消息 "It's the weekend!"。工作流不会因为条件跳转操作跳过了步骤 friday 而不执行该步骤,并且工作流不会因为 return 在步骤 weekend 结束时停止执行工作流而不执行步骤 workWeek

使用 for 循环进行迭代

您可以使用 for 循环遍历一系列数字或通过列表或映射等数据集合。

您可以使用基于项的迭代来浏览列表或映射中的每一项。如果您要在特定数值范围内进行迭代,则可以使用基于范围的迭代。

如需了解详情和示例,请参阅有关迭代的语法参考文档。

后续步骤