回调,返回值和HTML5 executeSql函数

时间:2009-12-13 23:22:54

标签: javascript html5 callback closures

我有一个大问题。我知道这是关于回调,关闭,但我不知道如何解决问题。这是我的代码

$.Model.extend('Article',
{
     findAll : function(params, success, error){                
                var result = []
                db.transaction(function(tx) {
                    tx.executeSql('select * from contents', [],function(tx, rs) {
                        for(var i=0; i<rs.rows.length; i++) {
                            var row = rs.rows.item(i)
                            result[i] = {
                                id: row['id'],
                                title: row['title'],
                                body: row['body']
                            }
                        }
                    })
                })
                //here result is undefined
                alert(result)
                return result
    }
})
//undefined
var view = Article.findAll

我知道executeSql是异步函数,但我不知道如何保存并返回executeSql的结果。我使用javascript mvc和HTML离线数据库。

感谢您的帮助

4 个答案:

答案 0 :(得分:5)

W3C Web数据库规范讨论了对异步和同步数据库操作的支持。 (See 4.3 and 4.4)

如果您不能使用同步实现,那么您可能需要考虑像这样处理问题:

$.Model.extend('Article',
{
     findAll : function(params, success, error){                
                var result = []
                db.transaction(function(tx) {
                    tx.executeSql('select * from contents', [],function(tx, rs) {
                        for(var i=0; i<rs.rows.length; i++) {
                            var row = rs.rows.item(i)
                            result[i] = {
                                id: row['id'],
                                title: row['title'],
                                body: row['body']
                            }
                        }

                        success(result); //toss the result into the 'success' callback
                    })
                })
                //here result is undefined
                alert(result)
                return result
    }
})

Article.findAll([], function(view) {
        //...
    }, function() {
        //error occured
    });

答案 1 :(得分:0)

我有同样的问题,但您可能想要使用这个让生活更轻松的小包装库;)

http://github.com/grosser/arjs

答案 2 :(得分:0)

我遇到了同样的问题,特别是在移动开发项目上。我创建了一个库,无需回调: http://code.google.com/p/proto-q/

这使我的代码更容易进行故障排除,维护和增强。

我添加了对AJAX,Web worker,脚本注入和存储API的支持。我希望它有所帮助。

答案 3 :(得分:0)

您尝试同步使用结果,这是您在定义之前的访问结果(实际上在您的代码示例中它未定义,它是一个空数组)虽然我希望这是因为您已将声明从其原始位置移动到弄清楚发生了什么。

试试这个修改过的例子: -

$.Model.extend('Article',
{
    findAll : function(params, success, error){                
            db.transaction(function(tx) {
                tx.executeSql('select * from contents', [], function(tx, rs) {
                    var result = [];
                    for(var i=0; i<rs.rows.length; i++) {
                        var row = rs.rows.item(i)
                        result.push({
                            id: row['id'],
                            title: row['title'],
                            body: row['body']
                        });
                    }
                    success(result);
                });
            });
    }
});

Article.findAll({}, function(result) { 
    // process result here
});

Article.findAll()现在是一个异步函数,它的回调(闭包)接收结果。