如何处理JavaScript中的异步函数结果

时间:2012-02-24 12:11:19

标签: javascript html5 sqlite

来自c#背景,我可能从完全错误的角度看待JavaScript,所以请耐心等待。

抛弃异步的优点一分钟, 假设我只是想从HTML5页面中的SQLite数据库中检索一个值。 我想看到的是像

var something = db.getPicture(1);

现在考虑一下(可能非常天真)实现这个:

this.getPicture(id)
{
    this.database.transaction(function(tx)
    {
        tx.executeSql('SELECT ......', null, function(tx, results)
        {
            if (results.rows.length == 1)
                return results.rows.items(0).Url; //This of course does not resturn
                                                    //anything to the caller of .getPicture(id)
        }
    },
    function(error)
    {
        //do some error handling
    },
    function(tx)
    {
        //no error
    });                     
}

首先,它是嵌套函数的一大堆,第二个......我无法将从数据库中获得的结果作为.getPicture()函数的值返回。

这是简单的版本,如果我想先从表中检索索引,该怎么办? 然后在下一个查询中使用该索引,依此类推......

对于JavaScript开发人员来说这是正常的,我是完全错误的,有解决方案等吗?

1 个答案:

答案 0 :(得分:2)

JavaScript中遵循的基本模式(在Web浏览器或Node.js等异步环境中)是操作完成时需要完成的工作应该在API提供的“成功”回调中进行。在你的情况下,这是传递给你的“executeSql()”方法的函数。

this.getPicture = function(id, whenFinished)
{
    this.database.transaction(function(tx)
    {
        tx.executeSql('SELECT ......', null, function(tx, results)
        {
            if (results.rows.length == 1)
                whenFinished(results.rows.items(0).Url);
        }
    },

在该设置中,数据库操作的结果作为参数传递给调用“getPicture()”时提供的函数。

因为JavaScript函数形成闭包,所以它们可以访问调用上下文中的局部变量。也就是说,作为“whenFinished”参数传递给“getPicture()”的函数将有权访问“getPicture()”处的实时局部变量。