Inline 任务
Inline 任务是 Taskflow 中的一种特殊系统任务,用于在工作流执行过程中直接执行 JavaScript 代码。它提供了一种灵活的方式来处理数据转换、条件判断和简单的业务逻辑。
核心特性
脚本执行
- 支持 ES6+ JavaScript
- 内置工具函数库
- 同步执行模式
数据处理
- 工作流上下文访问
- 复杂对象处理
- 类型转换支持
安全控制
- 沙箱执行环境
- 资源使用限制
- 超时保护机制
任务参数
参数 | 描述 | 必需/可选 |
---|---|---|
expression | JavaScript 表达式或函数。支持 ES6+ 语法,可以访问工作流变量。 | 必需 |
evaluatorType | 脚本评估器类型。目前支持 graaljs (GraalJS 引擎)。 | 可选,默认为 graaljs |
inputParameters | 传递给脚本的输入参数。可以在表达式中通过 $.paramName 访问。 | 可选 |
内置对象和函数
1. 工作流上下文
workflow
- 当前工作流实例workflow.workflowId
- 工作流IDworkflow.input
- 工作流输入参数workflow.variables
- 工作流变量
2. 任务上下文
task
- 当前任务实例task.taskId
- 任务IDtask.referenceTaskName
- 任务引用名task.input
- 任务输入参数
3. 工具函数
// 日期处理
moment() // 当前时间
moment('2024-01-01') // 解析日期
moment().add(1, 'days') // 日期计算
// 数学运算
Math.floor(3.14) // 向下取整
Math.ceil(3.14) // 向上取整
Math.round(3.14) // 四舍五入
// 字符串处理
String.prototype.trim() // 去除空格
String.prototype.split() // 字符串分割
String.prototype.replace() // 字符串替换
配置示例
1. 基础表达式
{
"name": "inline_task",
"taskReferenceName": "inline_task_ref",
"type": "INLINE",
"inputParameters": {
"value": "${workflow.input.someValue}",
"expression": "$.value * 2"
}
}
2. 条件判断
{
"name": "check_condition",
"taskReferenceName": "condition_ref",
"type": "INLINE",
"inputParameters": {
"age": "${workflow.input.age}",
"expression": "if ($.age >= 18) { return 'adult'; } else { return 'minor'; }"
}
}
3. 数据转换
{
"name": "transform_data",
"taskReferenceName": "transform_ref",
"type": "INLINE",
"inputParameters": {
"users": "${workflow.input.users}",
"expression": "$.users.map(user => ({
id: user.id,
fullName: `${user.firstName} ${user.lastName}`,
age: moment().diff(moment(user.birthDate), 'years')
}))"
}
}
最佳实践
代码组织
- 保持表达式简洁
- 使用适当的注释
- 遵循代码风格规范
错误处理
- 添加适当的验证
- 实现错误捕获
- 提供默认值
性能优化
- 避免复杂计算
- 限制数据量
- 合理使用缓存
使用限制
执行环境
- 不支持异步操作
- 不能访问外部资源
- 限制执行时间
资源限制
- 内存使用上限
- CPU 时间限制
- 代码长度限制
安全限制
- 禁止文件操作
- 禁止网络访问
- 禁止系统调用
调试技巧
日志输出
// 在表达式中使用 console.log console.log('Debug:', $.someValue);
错误追踪
try { // 业务逻辑 } catch (error) { console.error('Error:', error); throw error; }
数据验证
if (!$.requiredValue) { throw new Error('Required value is missing'); }
UI 配置指南
- 在工作流编辑器中添加 Inline 任务
- 配置输入参数和表达式
- 使用内置的代码编辑器
- 测试表达式执行结果
常见问题
表达式执行失败
- 检查语法错误
- 验证输入参数
- 查看执行日志
性能问题
- 优化代码逻辑
- 减少数据处理量
- 使用缓存机制
数据类型错误
- 确保类型匹配
- 添加类型转换
- 验证输入数据
示例场景
数据验证和转换
// 验证和转换用户输入 function validateAndTransform(input) { if (!input.email) { throw new Error('Email is required'); } return { email: input.email.toLowerCase(), name: input.name || 'Anonymous', createdAt: moment().toISOString() }; }
条件路由
// 根据条件决定下一步操作 function determineNextStep(data) { if (data.amount > 1000) { return 'high_value_process'; } else if (data.amount > 100) { return 'normal_process'; } return 'low_value_process'; }
数据聚合
// 合并多个任务的结果 function aggregateResults(results) { return results.reduce((acc, result) => ({ total: acc.total + result.value, count: acc.count + 1, average: (acc.total + result.value) / (acc.count + 1) }), { total: 0, count: 0, average: 0 }); }