Javascript 变量不变
Javascript var not changing
我想修改这个在提交前做一些检查的 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
将不会在包含函数完成时显示它的值。
使用异步操作结果的唯一方法是在表示异步操作已完成的回调中使用它,或者从该回调中调用一个函数并向其传递所需的数据。这些是你的选择。你根本无法按照你想要的方式去做。
对于此处的所有问题,如果您描述的是您试图解决的实际问题,而不是用您尝试的解决方案来解释问题,我们可能会在更高层次上提供帮助。
在 Whosebug 上,未能描述您真正想要完成的事情被称为 XY problem。
您不能在异步响应中 运行 e.preventDefault()
,因为在异步响应完成时,表单已经提交。
您可能需要改变您的逻辑,以便在所有异步操作完成且没有错误之前不提交表单。然后,您将手动提交表单。
我想修改这个在提交前做一些检查的 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
将不会在包含函数完成时显示它的值。
使用异步操作结果的唯一方法是在表示异步操作已完成的回调中使用它,或者从该回调中调用一个函数并向其传递所需的数据。这些是你的选择。你根本无法按照你想要的方式去做。
对于此处的所有问题,如果您描述的是您试图解决的实际问题,而不是用您尝试的解决方案来解释问题,我们可能会在更高层次上提供帮助。
在 Whosebug 上,未能描述您真正想要完成的事情被称为 XY problem。
您不能在异步响应中 运行 e.preventDefault()
,因为在异步响应完成时,表单已经提交。
您可能需要改变您的逻辑,以便在所有异步操作完成且没有错误之前不提交表单。然后,您将手动提交表单。