2012-03-29 74 views
1

我正在构建一个使用面向对象技术的JavaScript应用程序,我遇到了一个问题,希望这里有人可以帮助我解决问题。从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 
      ); 
     } 
    ); 
} 

这个工程完全记录结果到控制台时,如预期,但是当我试图调用返回

console.log(db.retrieveAllStoreSearches()); 

未定义 - 在下面的代码段(其可初始化所有对象,并负责建立应用程序DOM的结构和功能位于不同的脚本)方法。

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

任何人都可以提供任何指针,我可能做错了什么?

回答

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) 
}); 
+0

胡安你是男人!这正是我需要的。非常感谢你帮助解决这个'错误'并提升我在这个过程中的学习!像梦一样工作:) – EinZweiDrei 2012-03-29 22:04:42