我正在创建一个应用程序,我想从本地数据库中获取数据。我有3张桌子。我想要的是当我从第一张表中获取数据时说来自员工详细信息我检查几个条件,如果员工是超级用户,那么它将从第二个表项目详细信息中获取数据。所以我想要的是当员工是超级用户时,它应该开始执行第二个表中的数据提取,然后进一步移动。但是当它获得超级用户条件时会发生什么,并且一旦发现它内部的tx.executeSql函数就会生成线程并继续从第一个表开始执行,并在完成后从项目详细信息开始执行数据。 任何人都可以帮助使这个执行工作在我想要的流程中。
function getusersdetails()
{
db.transaction(function(tx){
tx.executeSql('select * from users',[],function(tx,results){
var dataset = results.rows.length;
if(dataset>0)
{
for(var i=0;i<dataset;i++)
{
if(results.rows.item(i).employ_type =='SU')
{
tx.executeSql('Select * from accessRites where user_Id = results.rows.item(i).user_id',[],function(tx,result){
//some execution here;
});
}
else if(results.rows.item(i).employ_type =='Manager')
{
tx.executeSql('Select * from usergroups where user_Id = results.rows.item(i).user_id',[],function(tx,results){
// some execution here;
});
}
else
{
//some execution here;
}
//here some usere execution ;
}
}
});
});
在上面的代码中,当用户类型为su时,它会在检测到tx.executeSql函数后立即执行第二个第二个函数,而是继续执行第一个查询,然后在SU条件下运行tx.execute我想要的是,如果用户类型是Su,那么它应该在其中完成tx.execute函数,然后继续执行,因为最后需要数据。
答案 0 :(得分:0)
executeSql
回调始终是异步执行的。
您应该编写代码,以便每个“在此处执行”代码独立于任何其他代码。
或者,您可以通过连接获得所需的所有数据,以便您拥有单个结果集:
tx.executeSql('SELECT * FROM users' +
' LEFT JOIN accesRites USING (user_Id)' +
' LEFT JOIN usergroups USING (user_Id)',
[], function(tx, result){
for (var i = 0; i < results.rows.length; i++) {
if (results.rows.item(i).employ_type =='SU') {
...
} else if (results.rows.item(i).employ_type =='Manager') {
...
} else {
...
}
}
});
注意:如果一条accessRights
条记录有多个匹配的usergroups
/ users
条记录,您将获得多条记录,其结果中包含重复的users
条数据。