我有以下的javascript,我执行sql查询,并根据结果我需要执行第二次查询。虽然我管理使用闭包迭代第二个查询的正确值,但我还没有能够返回所需的值。我一直都没有定义。
db.transaction(function(tx) {
tx.executeSql('SELECT * FROM maintainance', [], function(tx, results){
maintainance_length = results.rows.length;
maintanance_query = results.rows;
for (i = 0; i < maintanaince_length; i++) {
maintainance_title = maintanance_query[i].element;
var classAction = function(){
if(maintanance_query[i].code == '0'){
return 'no';
}else{
//over here i use the closure to iterate each seperate maintainance_title value
(function(maintainance_title){
db.transaction(function(tx) {
tx.executeSql('SELECT * from maintainance_history WHERE element = \''+maintainance_title+'\'',
[], function(tx, results){
if(results.rows.length > 0 && results.rows[0].action == '1'){
return 'ok';
}else{
return 'warn';
}
},function(tx, error){
console.log(error);
console.log(tx);
});});
})(maintainance_title);
}
}
historyIcon = "<div class=\""+classAction()+"\"></div>";
}
},function(tx, error){
}
);
});
我已经测试了一些代码,但结果仍然是&#34;未定义&#34; classAction不是函数的未捕获异常
答案 0 :(得分:1)
同意我的评论,因为classAction
是异步的,我们必须将它视为异步函数。这意味着return
走出窗外!我们可以使用Promises,但这需要更重要的重写。这是我提出的使用回调的简单重写。这仍然可能无效,具体取决于您对historyIcon
的处理方式。但是historyIcon
将被设置为适当的值,如果您需要处理它,可能会有另一个回调。
db.transaction(function(tx) {
tx.executeSql('SELECT * FROM maintainance', [], function(tx, results){
maintainance_length = results.rows.length;
maintanance_query = results.rows;
for (i = 0; i < maintanaince_length; i++) {
maintainance_title = maintanance_query[i].element;
var classAction = function(callback){
if(maintanance_query[i].code == '0'){
callback('no');
}
else {
(function(maintainance_title){
db.transaction(function(tx) {
tx.executeSql('SELECT * from maintainance_history WHERE element = \''+maintainance_title+'\'', [],
function(tx, results){
if(results.rows.length > 0 && results.rows[0].action == '1'){
callback('ok')
}else{
callback('warn');
}
},function(tx, error){
console.log(error);
console.log(tx);
});
});
})(maintainance_title);
}
};
classAction(function(action) {
historyIcon = "<div class=\""+action+"\"></div>";
});
}
},function(tx, error){
// error stuff
});
});