编写工作流脚本的最佳实践

此部分描述编写工作流脚本和确保脚本如预期运行的最佳实践。

在本主题中︰

使用之前检查值类型

不同类型的值在不同语句中有不同的行为。为了避免出现不可预测的结果,请在使用值之前检查值类型。

  • 如果您不确定,请检查值类型。

    例如,要检查“缺陷 ID”字段 (BG_BUG_ID) 的值类型,请执行以下操作:

    Copy code
    var 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 code
    if (Bug_Fields)("BG_BUG_ID").Value == 10
  • 如果您清楚值类型,请使用严格相等 (===)

    例如,仅当值为字符串 10 时才运行以下语句。

    Copy code
    if (Bug_Fields)("BG_BUG_ID").Value === '10'

返回页首

检查值是否为空

为了避免错误,在尝试使用值之前,应检查所有值均不为空。

例如,假设自定义用户字段 BG_USER_01 的值是一个数组,要检查该值是否为空,请使用以下命令:

Copy code
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 对象,然后比较这些日期对象。

例如,假设您要定义如果错误的检测日期早于特定日期,则弹出消息框,您可以编写以下脚本:

Copy code
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 子句中的代码块。

例如:

Copy code
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 事件。

Copy code
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,则当用户创建缺陷时,会同时打开消息框和“新建缺陷”对话框。

Copy code
function Bug_New()  {
    MsgBox('Show this message');
    Bug_Fields("BG_ACTUAL_FIX_TIME").Value = 50;
}

如果按如下所示使用 promise 或 await/async,当用户创建缺陷时,会弹出消息框,只有当用户在消息框中单击“确定”时,才会出现“新建缺陷”对话框。

Copy code
function Bug_New()  {
    return MsgBox('Show this message before new dialog').then(function() {
    Bug_Fields("BG_ACTUAL_FIX_TIME").Value = 50;
});
}
Copy code
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 之前,请检查您的浏览器是否支持它。

返回页首

将日志级别设置为调试以进行故障排除

适用于: 高级项目脚本。

为了帮助在执行高级项目脚本时进行故障排除,请将日志级别设置为调试,这样会记录对调试最有用的事件。

有关设置日志级别的详细信息,请参阅配置服务器日志文件设置

返回页首