来自闭包的返回值给出了undefined

时间:2016-04-27 21:58:44

标签: 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){

                }
            );
         }); 

我已经测试了一些代码,但结果仍然是&#34;未定义&#34; classAction不是函数的未捕获异常

1 个答案:

答案 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
    });
 });