如果基于更改值,Azure 逻辑应用程序条件无法在循环中工作

2024-05-02

我需要编写一个简单的 LogicApp,它连接到 http 端点,接收一些 JSON,循环遍历 JSON 消息,并根据消息中的值将其分块提交到不同的 http 端点。

在这样做时,我得出的结论是,For Each 循环内的条件始终评估循环之前的条件并执行与循环之前的结果匹配的路径,即使结果应该已经更改,因为一些变量已在循环。

我已经成功地用下面的例子来说明这个问题。

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Compose": {
                "inputs": "@variables('TestStr')",
                "runAfter": {
                    "Compose_3": [
                        "Succeeded"
                    ]
                },
                "type": "Compose"
            },
            "Compose_3": {
                "inputs": "@variables('TestArray')",
                "runAfter": {
                    "For_each": [
                        "Succeeded"
                    ]
                },
                "type": "Compose"
            },
            "For_each": {
                "actions": {
                    "Compose_2": {
                        "inputs": "@variables('TestArray')",
                        "runAfter": {
                            "Condition": [
                                "Succeeded"
                            ]
                        },
                        "type": "Compose"
                    },
                    "Condition": {
                        "actions": {
                            "Append_to_array_variable": {
                                "inputs": {
                                    "name": "TestArray",
                                    "value": "@items('For_each')"
                                },
                                "runAfter": {},
                                "type": "AppendToArrayVariable"
                            },
                            "Set_variable_2": {
                                "inputs": {
                                    "name": "TestStr",
                                    "value": "XXXX"
                                },
                                "runAfter": {
                                    "Append_to_array_variable": [
                                        "Succeeded"
                                    ]
                                },
                                "type": "SetVariable"
                            }
                        },
                        "else": {
                            "actions": {
                                "Set_variable": {
                                    "inputs": {
                                        "name": "TestStr",
                                        "value": "not"
                                    },
                                    "runAfter": {},
                                    "type": "SetVariable"
                                }
                            }
                        },
                        "expression": {
                            "and": [
                                {
                                    "equals": [
                                        "@variables('TestStr')",
                                        "BlankValue"
                                    ]
                                }
                            ]
                        },
                        "runAfter": {},
                        "type": "If"
                    }
                },
                "foreach": "@variables('FullArray')",
                "runAfter": {
                    "Initialize_variable_3": [
                        "Succeeded"
                    ]
                },
                "type": "Foreach"
            },
            "Initialize_variable": {
                "inputs": {
                    "variables": [
                        {
                            "name": "TestStr",
                            "type": "String",
                            "value": "BlankValue"
                        }
                    ]
                },
                "runAfter": {},
                "type": "InitializeVariable"
            },
            "Initialize_variable_2": {
                "inputs": {
                    "variables": [
                        {
                            "name": "TestArray",
                            "type": "Array"
                        }
                    ]
                },
                "runAfter": {
                    "Initialize_variable": [
                        "Succeeded"
                    ]
                },
                "type": "InitializeVariable"
            },
            "Initialize_variable_3": {
                "inputs": {
                    "variables": [
                        {
                            "name": "FullArray",
                            "type": "Array",
                            "value": [
                                {
                                    "key": "value1"
                                },
                                {
                                    "key": "value2"
                                },
                                {
                                    "key": "value3"
                                }
                            ]
                        }
                    ]
                },
                "runAfter": {
                    "Initialize_variable_2": [
                        "Succeeded"
                    ]
                },
                "type": "InitializeVariable"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {},
        "triggers": {
            "Recurrence": {
                "recurrence": {
                    "frequency": "Month",
                    "interval": 3
                },
                "type": "Recurrence"
            }
        }
    }
}

我希望下面的 LogicApp 执行循环三次,每次评估条件并仅执行一次数组插入,其中 TestArray 包含一个条目

{
  "key":"value1"
}

字符串 TestStr 的值为“not”

但实际结果似乎有所不同 - TestArray 包含 FullArray 中的所有三个条目,而 TestStr 是“XXXX”

我在这里缺少什么?有什么解决方法吗?


我已经发现了这种行为的原因。如果将来有人遇到此问题,请在此发帖。

For_each 循环默认并行执行。这就是为什么在循环开始之前评估所有迭代的条件的原因。

有一种方法可以关闭它 - 在Settings https://i.stack.imgur.com/kpMeE.png您可以打开并发控制并设置并行性 https://i.stack.imgur.com/HA8LR.png to 1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果基于更改值,Azure 逻辑应用程序条件无法在循环中工作 的相关文章

随机推荐