编写工作流脚本的最佳实践
此部分描述编写工作流脚本和确保脚本如预期运行的最佳实践。
在本主题中︰
- 使用之前检查值类型
- 检查值是否为空
- 在比较之前将日期字符串转换为日期对象
- 为 switch 添加 break 语句并提供默认操作
- 区分新建实体和实体详细信息对话框
- 避免定义重复的变量或函数
- 关于消息框的使用
- 将日志级别设置为调试以进行故障排除
使用之前检查值类型
不同类型的值在不同语句中有不同的行为。为了避免出现不可预测的结果,请在使用值之前检查值类型。
-
如果您不确定,请检查值类型。
例如,要检查“缺陷 ID”字段 (BG_BUG_ID) 的值类型,请执行以下操作:
Copy codevar valuetype = typeof Bug_Fields("BG_BUG_ID").Value;
//Print it in console or show message dialog directly
console.log(valuetype);
//MesgBox(valuetype) -
如果您不想在字符串和数字之间进行检查,请使用松散相等 (==)。
例如,当值为字符串
10
或数字10
时,运行以下语句。Copy codeif (Bug_Fields)("BG_BUG_ID").Value == 10
-
如果您清楚值类型,请使用严格相等 (===)
例如,仅当值为字符串
10
时才运行以下语句。Copy codeif (Bug_Fields)("BG_BUG_ID").Value === '10'
检查值是否为空
为了避免错误,在尝试使用值之前,应检查所有值均不为空。
例如,假设自定义用户字段 BG_USER_01 的值是一个数组,要检查该值是否为空,请使用以下命令:
var userField = Bug_Fields("BG_USER_01");
var value = userField.Value;
var isMultiple = userField.IsMultiValue;
if (isMultiple && Array.isArray(value)) && value.length > 0) {
//Execute something
}
在比较之前将日期字符串转换为日期对象
只要有效,各种日期字符串格式都会被接受。如果要比较日期,建议首先将每个日期字符串切换为 Date 对象,然后比较这些日期对象。
例如,假设您要定义如果错误的检测日期早于特定日期,则弹出消息框,您可以编写以下脚本:
function Bug_MoveTo() {
var detectionDate = new Date(Bug_Fields("BG_DETECTION_DATE").Value);
var toComparedDate = new Date('2023/12/12');
if (detectionDate < toComparedDate) {
MsgBox(Bug_Fields("BG_BUG_ID").Value);
}
}
为 switch 添加 break 语句并提供默认操作
如果您使用 switch
语句根据不同的条件执行不同的操作,请确保还添加 break
语句和 default
子句。
-
break 语句。switch case 后面的
break
用于避免 switch 语句中的失败。 -
default 子句。如果没有匹配,则执行 default 子句中的代码块。
例如:
functionBug_FieldChange(fieldName) {
var StatusFieldName = 'BG_STATUS';
if (fieldName == StatusFeildName) {
var value = Bug_Fields(StatusFieldName).Value;
switch (value) {
case 'New':
// add code block to define what to execute if the status is changed to New.
break;
case 'Open'
// // add code block to define what to execute if the status is changed to Open.
break;
default:
// // add code block to define what to execute if there is no match.
break
}
return;
}
// add code block to define what to execute if the changed field is not Status.
}
区分新建实体和实体详细信息对话框
在将工作流脚本添加到事件之前,请确认当用户创建实体或打开实体时是否触发该事件。
在以下示例中,当用户创建缺陷时,将触发 Bug_FieldChange 事件。
function Bug_FieldChange(fieldName) {
if (ActiveDialogName === 'New Bug') {
//add code to define what to execute when a user creates a defect.
} else {
//add code to define what to execute when a user edits a defect.
}
}
避免定义重复的变量或函数
如果在一个部分中定义了一个变量或函数,然后在其他部分中添加了同名的另一变量或函数,则这两个部分将发生冲突。不会执行其中一个变量或函数。
要避免在定义变量或函数时发生不可预知的冲突,请始终检查项目中是否存在同名的其他变量或函数。
关于消息框的使用
当您使用 MsgBox 函数弹出消息框时,它不会阻止其余操作的执行。如果您想一直阻止操作直到消息框中执行用户交互,您可以使用 promise 或 await/async。
Note: MsgBox 不适用于高级项目脚本。
例如,如果您按如下方式自定义 Bug_New 事件而不使用 promise 或 wait/async,则当用户创建缺陷时,会同时打开消息框和“新建缺陷”对话框。
function Bug_New() {
MsgBox('Show this message');
Bug_Fields("BG_ACTUAL_FIX_TIME").Value = 50;
}
如果按如下所示使用 promise 或 await/async,当用户创建缺陷时,会弹出消息框,只有当用户在消息框中单击“确定”时,才会出现“新建缺陷”对话框。
function Bug_New() {
return MsgBox('Show this message before new dialog').then(function() {
Bug_Fields("BG_ACTUAL_FIX_TIME").Value = 50;
});
}
async function Bug_New() {
await MsgBox('Show this message before new dialog');
Bug_Fields("BG_ACTUAL_FIX_TIME").Value = 50;
}
Note: await/async 对您的浏览器版本要求较高。在使用 await/async 之前,请检查您的浏览器是否支持它。
将日志级别设置为调试以进行故障排除
适用于: 高级项目脚本。
为了帮助在执行高级项目脚本时进行故障排除,请将日志级别设置为调试,这样会记录对调试最有用的事件。
有关设置日志级别的详细信息,请参阅配置服务器日志文件设置。