javascript - 闭包的返回值未定义

标签 javascript closures

我有下面的一段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/

相关文章:

javascript - 如何在 1-arg javascript 函数中使用 2 个参数?

javascript - 在 VueJS 组件中引用静态资源

javascript - Animations运行完可以倒转播放吗?

swift - swift 3 中的回调语法

PHP:访问其闭包范围之外的变量

actionscript-3 - AS3 闭包困惑

用于更改 <h4> 的文本和字形的 Javascript 函数

javascript - 如何在 AngularJS 指令中绑定(bind)属性?

javascript - @ react 三/ react 三纤维 : useLoader() to load new file on props change

javascript - 访问 Angular 工厂中的嵌套函数闭包