嵌套函数不返回

时间:2013-06-25 16:18:54

标签: javascript

我正在构建一个phonegap应用程序。我正在使用Web sql,一切正常,直到数据检索。

function getItemGroups(){

    var items_groups = new Array();
    var db = window.openDatabase("merbokDB", "1.0", "MerbokDB", 5232394);

    db.transaction(
        function(tx){
            tx.executeSql('SELECT * FROM item_groups',[],
                function(tx,result){
                    if(result.rows.length > 0){

                        var len = result.rows.length;

                        for (var i=0; i<len; i++){

                            items_groups.push(result.rows.item(i).item_group);

                        }
                        console.log(items_groups.join());

                    }
                }
                ,errorCB);
        },
        errorCB);

    return items_groups;
}
var myproducts = getItemGroups();

我的问题是当我运行代码“myproducts”变量为空时。但我可以看到

console.log(items_groups.join());

以下行在控制台中打印值。我回来的方式是不是错了?

1 个答案:

答案 0 :(得分:3)

我并不是100%熟悉您正在使用的框架,但一个很好的猜测是,传递到链中每个步骤的函数都是针对异步回调的。因此,无法保证他们在运行后的语句之前运行。所以基本上发生的是这一行:

return items_groups;

正在执行任何内部函数之前执行。所以它只是返回它的初始值,这是一个空数组。

片刻之后(甚至可能是几毫秒之后),执行内部函数并看到控制台日志输出。

使用这样的异步功能时,不能依赖按顺序执行的代码行。您不必在“下一行”执行逻辑,而是必须在某种回调函数中执行它。在这种情况下,检索数据后的最终回调似乎是这样的:

function(tx,result){
    if(result.rows.length > 0){

        var len = result.rows.length;

        for (var i=0; i<len; i++){

            items_groups.push(result.rows.item(i).item_group);

        }
        console.log(items_groups.join());

    }
}

无论你要对myproducts变量做什么,都需要在该函数中启动。