控制工作流中的执行顺序

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

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

准备工作

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. 您������已有一个工作流,想要更改其执行顺序。如需了解如何创建和部署工作流,请参阅创建和更新工作流。

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

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

基本跳转操作

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

控制台

  1. 在Google Cloud 控制台中打开“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_bool 和 return_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”页面:
    前往“工作流”

  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_A、STEP_B、STEP_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_A、STEP_B、STEP_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 循环遍历一系列数字或通过列表或映射等数据集合。

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

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

后续步骤