8
n8n 中文网amn8n.com

并行子工作流执行后等待全部完成模式

高级

这是一个Other, Building Blocks领域的自动化工作流,包含 18 个节点。主要使用 If, Set, Code, Wait, Webhook 等节点。 并行子工作流执行后等待全部完成模式

前置要求
  • HTTP Webhook 端点(n8n 会自动生成)
  • 可能需要目标 API 的认证凭证
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "nodes": [
    {
      "id": "0d911b91-bb9a-4177-8cd5-12ddddf1bc61",
      "name": "当点击\"测试工作流\"时",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        580,
        405
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "d13f78f7-4093-435f-8b38-722f4a5c7a1f",
      "name": "遍历项目",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1020,
        405
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "97d26220-a85f-4c40-b97c-b36f2d235776",
      "name": "Webhook 回调等待",
      "type": "n8n-nodes-base.wait",
      "position": [
        1720,
        445
      ],
      "webhookId": "5cd058b4-48c8-449a-9c09-959a5b8a2b48",
      "parameters": {
        "resume": "webhook",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1.1
    },
    {
      "id": "ee02d5cb-8151-4b24-a630-77a677b1434a",
      "name": "更新已完成集合",
      "type": "n8n-nodes-base.code",
      "position": [
        1940,
        445
      ],
      "parameters": {
        "jsCode": "let json = $('If All Finished').first().json;\nif (!json.finishedSet) json.finishedSet = [];\nlet finishedItemId = $('Webhook Callback Wait').item.json.body.finishedItemId;\nif (!json.finishedSet[finishedItemId]) json.finishedSet.push(finishedItemId);\nreturn [json];"
      },
      "typeVersion": 2
    },
    {
      "id": "09f1cf3f-9e32-43f2-9e57-d7a33970dac4",
      "name": "初始化已完成集合",
      "type": "n8n-nodes-base.set",
      "position": [
        1240,
        285
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "193ab8f1-0e23-491c-914e-b8b26b0160f7",
              "name": "finishedSet",
              "type": "array",
              "value": "[]"
            }
          ]
        }
      },
      "executeOnce": true,
      "typeVersion": 3.4
    },
    {
      "id": "105d8f64-8ade-4e02-8722-587a35f2b046",
      "name": "模拟多项目并行处理",
      "type": "n8n-nodes-base.code",
      "position": [
        780,
        405
      ],
      "parameters": {
        "jsCode": "return [\n  {requestId: 'req4567'},\n  {requestId: 'req8765'},\n  {requestId: 'req1234'}\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "c5f72fa0-693e-4134-910f-8fd0767861d1",
      "name": "如果全部完成",
      "type": "n8n-nodes-base.if",
      "position": [
        1460,
        285
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "385c3149-3623-4dd2-9022-770c32f82421",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.finishedSet.length }}",
              "rightValue": "={{ $('Simulate Multi-Item for Parallel Processing').all().length }}"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "20d16393-8573-4cc1-adc0-034f0f1def70",
      "name": "通过 Webhook 启动子工作流",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1180,
        645
      ],
      "parameters": {
        "url": "={{ $env.WEBHOOK_URL }}/webhook/parallel-subworkflow-target",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "requestItemId",
              "value": "={{ $json.requestId }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "callbackurl",
              "value": "={{ $execution.resumeUrl }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "4ad48520-39b3-4016-a6a9-dd789c079e08",
      "name": "确认完成",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1780,
        665
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "ad1018a1-3b9d-4613-b23f-136763a514ba",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        720,
        605
      ],
      "parameters": {
        "color": 3,
        "width": 390,
        "height": 109,
        "content": "### 异步启动多个子工作流"
      },
      "typeVersion": 1
    },
    {
      "id": "f4171d39-8bfe-4e3a-9b94-87d969abda2d",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1740,
        365
      ],
      "parameters": {
        "color": 3,
        "width": 283,
        "height": 80,
        "content": "### 伪同步等待所有子工作流完成"
      },
      "typeVersion": 1
    },
    {
      "id": "98657cd3-968c-4d66-aea0-4e3180f8508f",
      "name": "继续工作流(空操作)",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1780,
        205
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5a9518ea-456e-4975-bf6f-71bf9ed0a6e1",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        540,
        180
      ],
      "parameters": {
        "width": 1577.931818181817,
        "height": 684.1818181818179,
        "content": "## 主/父工作流"
      },
      "typeVersion": 1
    },
    {
      "id": "13ad3423-c3bf-4144-b76d-03daa8877bed",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        900
      ],
      "parameters": {
        "width": 1477.331211260329,
        "height": 189.2194473140495,
        "content": "### 子工作流"
      },
      "typeVersion": 1
    },
    {
      "id": "e92865b0-b3e9-4195-ae16-5c199875a04b",
      "name": "等待",
      "type": "n8n-nodes-base.wait",
      "position": [
        1440,
        940
      ],
      "webhookId": "2d62e5c2-ad4a-4e90-a075-7ca5212e015a",
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "710456c8-394d-4c45-8d8e-16e0a4095dc3",
      "name": "在父工作流上调用恢复",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "The callback resumes the parent workflow and reports which item finished.  There could be a race condition if the parent workflow was just resumed by a different sub-workflow but hasn't entered a webhook-wait again yet.  The delay and retry mitigates for the possibility that multiple subtasks complete and call back at once.",
      "position": [
        1660,
        940
      ],
      "parameters": {
        "url": "={{ $('Webhook').item.json.headers.callbackurl }}",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "finishedItemId",
              "value": "={{ $('Webhook').item.json.body.requestItemId }}"
            }
          ]
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.2,
      "waitBetweenTries": 3000
    },
    {
      "id": "2ee41b1a-89f0-4d2f-b2ff-74aef5baaa70",
      "name": "响应 Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1220,
        940
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={{ \n{\n  \"finishedItemId\": $json.body.requestItemId\n}\n}}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "04445a9a-61f9-468e-8589-3eeb403f2553",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        1000,
        940
      ],
      "webhookId": "14776b45-77d7-4220-808f-2d0a38bec4de",
      "parameters": {
        "path": "parallel-subworkflow-target",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2
    }
  ],
  "pinData": {},
  "connections": {
    "Wait": {
      "main": [
        [
          {
            "node": "Call Resume on Parent Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If All Finished": {
      "main": [
        [
          {
            "node": "Continue Workflow (noop)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Webhook Callback Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Initialize finishedSet",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Start Sub-Workflow via Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Respond to Webhook": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update finishedSet": {
      "main": [
        [
          {
            "node": "Acknowledge Finished",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Acknowledge Finished": {
      "main": [
        [
          {
            "node": "If All Finished",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook Callback Wait": {
      "main": [
        [
          {
            "node": "Update finishedSet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Initialize finishedSet": {
      "main": [
        [
          {
            "node": "If All Finished",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Sub-Workflow via Webhook": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking ‘Test workflow’": {
      "main": [
        [
          {
            "node": "Simulate Multi-Item for Parallel Processing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simulate Multi-Item for Parallel Processing": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 其他, 构建模块

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量18
分类2
节点类型11
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

作者
Hubschrauber

Hubschrauber

@hubschrauber

Software developer specializing in "back-end plumbing" to connect and sync data between large corporate systems, enabling application distribution/migration, scaling, and containerization. Using n8n for various orchestration tasks both at home and "on the job."

外部链接
在 n8n.io 查看

分享此工作流