我在尝试在Sqlite中验证部分网页表单时遇到了时间问题。
function submitForm()
{
var isValid = validateK2();
if(isValid)
submitK2();
}
function validateK2()
{
db.transaction(function(tx){
tx.executeSql("Select * From K2", [], function(tx, result){
if (results meet my criteria)
return true;
else
return false;
}, onSqlError);
});
}
但是当if(isValid ...)代码正在执行时,它返回undefined,因为validateK2函数尚未完成执行,因此尚未返回true或false。我在这里缺少什么?
编辑:该网站是一个门户网站,允许员工从文书工作菜单中选择填写。提交后,他们可能正在提交1个表单或5.所以@CL是正确的,我可以在executeSql回调中提交而不是返回true然后提交。但是,根据所选文档,我可能需要运行任何更多验证的事实意味着我需要一种动态方式来验证每个文档,在“提交”表单之前,能够检查所有文档是否有效。所以这就是我所做的:
var submitFinalTimeout;
var doc1IsValid;
var doc2IsValid;
var selectedDocCount = selectedDocs.length \\selectedDocs is an array containing all the documents that have been selected and completed
function ValidateForm()
{
submitFinalTimeout = window.setTimout(submitFinal, 3000);
if(selectedDocs.indexOf("Doc1") != -1)
validateDoc1();
if(selectedDocs.indexOf("Doc2") != -1)
validateDoc2();
}
function validateDoc1()
{
db.transaction(function(tx){
tx.executeSql("Select * From Doc1Data", [], function(tx, result){
if (results meet my criteria)
doc1IsValid = true;
selectedDocCount--;
if(selectedDocCount != 0)
{
window.cancelTimeout(submitFinalTimeout);
submitFinalTimeout = window.setTimeout(submitFinal, 3000);
}
}, onError);
});
}
function validateDoc2()
{
db.transaction(function(tx){
tx.executeSql("Select * From Doc2Data", [], function(tx, result){
if (results meet my criteria)
doc2IsValid = true;
selectedDocCount--;
if(selectedDocCount != 0)
{
window.cancelTimeout(submitFinalTimeout);
submitFinalTimeout = window.setTimeout(submitFinal, 3000);
}
}, onError);
});
}
function submitFinal()
{
if (doc1IsValid && doc2IsValid)
submitForm();
}
答案 0 :(得分:0)
传递给transaction
和executeSql
的函数是异步执行的。
如果您想要在事务中执行某些操作,则必须在该回调中执行此操作。
将return true
替换为submit2K
来电。