将数组从javascript类方法返回到脚本

时间:2012-03-29 21:33:25

标签: javascript dom scripting

我正在使用面向对象技术构建一个javascript应用程序,我遇到了一个问题,我希望有人可以帮我解决。

以下方法旨在返回一个填充了来自Web SQL数据库的数据行的数组:

retrieveAllStoreSearches : function(){
    this.db.transaction(
        function(transaction){
            transaction.executeSql(
                "SELECT name,store,address FROM searchResults ORDER BY name ASC",
                [],
                function(transaction, results){
                    var returnArr = [];
                    for(var i = 0; i < results.rows.length; i++){
                        var row = results.rows.item(i);
                        returnArr.push(row.name + ' | ' + row.address);
                    }
                    console.log('Length of returnArr: ' + returnArr.length);
                    console.log(returnArr);
                    return returnArr;
                },
                this.errorHandler
            );  
        }
    );
}

当我将结果记录到控制台时,这完全按预期工作但是当我尝试调用以下代码段中的方法时(位于不同的脚本中 - 初始化所有对象并负责构建应用程序DOM结构和功能)

console.log(db.retrieveAllStoreSearches());

返回undefined。

我无法弄清楚我做错了什么,因为当我在一个方法中使用return来允许从一个类访问一个对象并进入一个我从未遇到过任何问题的不同脚本时。

任何人都可以就我可能做错的事情提供任何指示吗?

1 个答案:

答案 0 :(得分:4)

无法完成,如果您的函数正在调用异步函数,返回结果的唯一方法是通过回调。这是异步函数的重点,其余的代码可以在调用完成之前继续运行。这是一种考虑返回值的不同方式(不会阻塞其余代码)。

因此,您必须将代码更改为以下内容(加上正确的错误处理)

retrieveAllStoreSearches : function(callback){
    this.db.transaction(
        function(transaction){
            transaction.executeSql(
                "SELECT name,store,address FROM searchResults ORDER BY name ASC",
                [],
                function(transaction, results){
                    var returnArr = [];
                    for(var i = 0; i < results.rows.length; i++){
                        var row = results.rows.item(i);
                        returnArr.push(row.name + ' | ' + row.address);
                    }
                    callback( returnArr );
                },
                this.errorHandler
            );
        }
    );
}

然后您可以使用console.log,如下所示

db.retrieveAllStoreSearches(function(records) {
    console.log(records ) 
});