1

我正在 ServiceNow 中编写 onChange 客户端脚本,并且在前端客户端上遇到 Javascript 错误问题。我不断收到 TypeError:无法读取未定义的属性“u_emp_name”。该变量似乎有所不同,因为在某一时刻我也未定义 u_pos_office,但是数据正确提取并且对我的代码功能没有性能影响。

什么可能导致类型错误?

脚本如下:

function onChange(control, oldValue, newValue, isLoading) {

    var billNum = g_form.getReference('u_billet',findBilletInfo);
    console.log('Emp Name: ' + billNum.u_emp_name);
    console.log('OFfice: ' + billNum.u_pos_office);
    console.log('Career Field: ' + billNum.u_pos_career_field);

   if (isLoading || newValue == '') {
      return;
   }

    if (oldValue != newValue){

        findBilletInfo(billNum);

    }

    function findBilletInfo(billNum){

        console.log('Bill Num' + billNum);
        console.log('encumbent' + billNum.u_emp_name);

        var empName = billNum.u_emp_name;
        var empNameStr = empName.toString();

        console.log(empName);
        console.log(empNameStr);

        g_form.setValue('u_organization_office',billNum.u_pos_office);
        g_form.setValue('u_encumbent',billNum.u_emp_name);
        g_form.setValue('u_old_career_field',billNum.u_pos_career_field);
        g_form.setValue('u_old_career_specialty',billNum.u_pos_career_specialty);   
        g_form.setValue('u_old_occupational_series',billNum.u_pos_series);
        g_form.setValue('u_old_grade',billNum.u_pos_grade);
        g_form.setValue('u_old_work_category',billNum.u_pos_category);
        g_form.setValue('u_old_job_title',billNum.u_pos_title);
        g_form.setValue('u_losing_rater',billNum.u_emp_rater_name);
        g_form.setValue('u_losing_reviewer',billNum.u_emp_reviewer_name);   

    }
}
4

1 回答 1

2

这里似乎是一个错误

var billNum = g_form.getReference('u_billet',findBilletInfo);
==> console.log('Emp Name: ' + billNum.u_emp_name);

在这种情况下billNum是未定义的,因为getReference它是异步运行的。请参阅该函数的文档

这意味着它不会立即或根本不会保证返回值。这可能就是为什么您有时会获得记录而不是其他人的原因。

您可以在findBilletInfo回调中移动这些调试日志以检查值

if (isLoading || newValue == '') {
  return;
}

var billNum = g_form.getReference('u_billet',findBilletInfo);

function findBilletInfo(billNum) {

    console.log('Bill Num' + billNum);
    console.log('encumbent' + billNum.u_emp_name);
    console.log('OFfice: ' + billNum.u_pos_office);
    console.log('Career Field: ' + billNum.u_pos_career_field);

    ...
}

如果您在 Firefox 或 Chrome 中进行调试,您应该能够将对象记录到控制台以一次浏览整个对象。

function findBilletInfo(billNum) {

    console.log(billNum);

    ...
}

输出在控制台中看起来像这样,您可以一次看到所有字段。

在此处输入图像描述

于 2018-06-13T18:28:57.473 回答