ServiceNow 客户端脚本异步查询以停止在新服务门户中提交 onSubmit

ServiceNow Client Script asynchronous query to stop submission onSubmit in new Service Portal

我有一个执行 GlideRecord 查询的客户端脚本,以检查是否已存在同名记录。

如果找到匹配的记录,我们需要停止提交表单。

我们在 CMS 门户上运行良好。

但是,新的服务门户不支持同步GlideRecord查询。

所以我不能使用 gr.query() 我需要使用回调,例如 gr.query(callback).

问题在于,由于回调是异步的,它实际上并没有阻止提交表单!

g_form.submitted = 假;不工作。这是因为脚本在回调有机会检索值之前继续提交表单。

如何根据异步回调返回的值停止提交表单?出于同样的原因,我们不能使用 GlideAjax,不再支持 getXMLWait()。

这是我尝试在新服务门户中运行的客户端脚本。

function onSubmit() {

    var group_name = g_form.getValue('u_group_name');
    g_form.hideAllFieldMsgs('error');

    /*Check if group already exists*/
    var rec = new GlideRecord('u_auth_group');
    rec.addQuery('u_group_name', u_group_name);
    rec.query(getAccountResponse);
    }

function getAccountResponse(rec) {
    while (rec.next()) {
        g_form.showFieldMsg('u_group_name', " Group Name exists already, please select another group name",'error');
        g_form.submitted = false; //DOES NOT STOP THE FORM FROM BEING SUBMITTED
        return false;
    }
}

这是在 CMS 门户中运行的现有脚本。

function onSubmit() {

    var group_name = g_form.getValue('u_group_name');
    g_form.hideAllFieldMsgs('error');

    /*Check if group already exists*/
    var rec = new GlideRecord('u_auth_group');
    rec.addQuery('u_group_name', u_group_name);
    rec.query(getAccountResponse);
    while (rec.next()) {
        g_form.showFieldMsg('u_group_name', " Group Name exists already, please select another group name",'error');
        g_form.submitted = false; //Stops the form from being submitted if a result is returned
        return false;
    }
}

我们正在使用赫尔辛基补丁 5,所以我们正在经历类似的成长烦恼。我们很幸运地使用了以下结构。服务器端仍有可用的 Glide 系统资源,包括 Glide Record。

您可以尝试将您的提交操作包装在自定义事件处理程序中。

尝试:

客户端:

c.createGroup = function(groupName){
return c.server.get({
  grpname : groupName
}.then(function(response){
    if (response.data.result == true){
    //don't submit
    }
    else{
    //submit
    }
}

服务器端

data.result = false
data.grpname = input.grpname

function checkGroupExists(data.grpname){
    /*Check if group already exists*/
    var rec = new GlideRecord('u_auth_group');
    rec.addQuery('u_group_name', data.grpname);
    rec.limit(1); //you only need to find one match
    rec.query()
while (rec.next()){
    data.result = true
    }
}

然后您可以将此事件处理程序绑定到 UI 中的某个操作。

我能够通过对 gliderecord 查询使用异步回调来解决这个问题。

function onSubmit() {
//If ServicePortal
if (!window) {
    if (g_scratchpad.isFormValid) {
        return true;
    }

    g_form.hideAllFieldMsgs("error");

    var actionName = g_form.getActionName();

    //Group Name contain letters numbers and dashes only
    var group_name = g_form.getValue("u_group_name");

    //Group name regular expression
    var regGrpName = /^([A-Za-z0-9\-]+)$/;

    //Check name against regular expression
    validGroupName = regGrpName.test(group_name);

    //Check if google group already exists
    var gg = new GlideRecord("u_system_group");
    gg.addQuery("u_group_name", group_name);

    //Callback function to control stop submit asynchronously
    gg.query(function() {       
        while (gg.next()) {
            g_form.showFieldMsg("u_group_name","Group Name " + gg.u_group_name + " already exists! Please enter a different group name.", "error", true);
            return false;
        }
        g_scratchpad.isFormValid = true;
        g_form.submit(actionName);
    });

    return false;
  }
}