Javascript var 不会改变

Javascript var not changing

本文关键字:改变 var Javascript      更新时间:2023-09-26

我想修改这个在提交前进行一些检查的 vtiger 函数。

我添加了globalvar,我想用它来检查是否可以提交表单。我可以在此处更改哪些内容以获得所需的结果?

Globalvar 在函数结束时应该是 2 或 3,但它保持 1,我还在设置它的地方添加了警报以确保它到达这些点。

registerRecordPreSaveEvent : function(form) {
    var thisInstance = this;
    if(typeof form == 'undefined') {
        form = this.getForm();
    }
    form.on(Vtiger_Edit_Js.recordPreSave, function(e, data) {
        var accountName = thisInstance.getAccountName(form);
        var recordId = thisInstance.getRecordId(form);
        globalvar = 1;
        var params = {};
        if(!(accountName in thisInstance.duplicateCheckCache)) {
            Vtiger_Helper_Js.checkDuplicateName({
                'accountName' : accountName, 
                'recordId' : recordId,
                'moduleName' : 'Accounts'
            }).then(
                function(data){
                   thisInstance.duplicateCheckCache[accountName+'_accounts'] = data['success'];
                   globalvar =2;
                },
                function(data, err){
                    thisInstance.duplicateCheckCache[accountName+'_accounts'] = data['success'];
                    thisInstance.duplicateCheckCache['message'] = data['message'];
                    var message = 'Company already exists';
                    Vtiger_Helper_Js.showMessage({'text' : message,'type': 'error'})
                }
            );
        }
        else {
            if(thisInstance.duplicateCheckCache[accountName+'_accounts'] == true){
                var message = 'Company already exists';
                    Vtiger_Helper_Js.showMessage({'text' : message,'type': 'error'})
            } else {
                delete thisInstance.duplicateCheckCache[accountName+'_accounts'];
                return true;
            }
        }
         if(!(accountName in thisInstance.duplicateCheckCache)) {
            Vtiger_Helper_Js.checkDuplicateName({
                'accountName' : accountName, 
                'recordId' : recordId,
                'moduleName' : 'Leads'
            }).then(
                function(data){
                    globalvar =3;
                    console.log(globalvar);
                    thisInstance.duplicateCheckCache[accountName+'_leads'] = data['success'];
                },
                function(data, err){
                    thisInstance.duplicateCheckCache[accountName+'_leads'] = data['success'];
                    thisInstance.duplicateCheckCache['message'] = data['message'];
                    var message = 'Lead already exists';
                    Vtiger_Helper_Js.showMessage({'text' : message,'type': 'error'})
                }
            );
        }
        else {
            if(thisInstance.duplicateCheckCache[accountName+'_leads'] == true){
                var message = 'Lead already exists';
                    Vtiger_Helper_Js.showMessage({'text' : message,'type': 'error'})
            } else {
                delete thisInstance.duplicateCheckCache[accountName+'_leads'];
                return true;
            }
        }
    console.log(globalvar);
        e.preventDefault();
    })
}

此代码中有许多异步操作。 异步操作在包含函数实际返回后的某个时间完成。 因此,不能在包含函数完成后立即使用异步操作的结果,因为异步操作本身仍在进行且尚未完成。

因此,在异步操作中设置globalVar(您正在执行的操作)在包含函数完成后不会显示其值。

使用异步操作

结果的唯一方法是在表示异步操作已完成的回调中使用它,或者从该回调调用函数并向其传递所需的数据。 这些是你的选择。 你根本无法按照你试图的方式去做。

与这里的所有问题一样,如果您描述您尝试解决的实际问题,而不是用您尝试的解决方案来解释问题,我们可能会在更高的层面上提供帮助。

在StackOverflow上,未能描述你真正想要完成的事情被称为XY问题。


您无法在异步响应中运行e.preventDefault(),因为当异步响应完成时,表单已提交。

您可能必须翻转逻辑,以便在所有异步操作完成且没有错误之前不会提交表单。 然后,您将手动提交表单。