我有下面的一段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){
}
);
});
我已经测试了代码的一些变体,但结果仍然是“未定义”的未捕获异常,即 classAction 不是函数
最佳答案
按照我的评论,由于 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
});
});
关于javascript - 闭包的返回值未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36901666/