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

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

问题描述:

从c#背景来看,我可能从完全错误的角度看待JavaScript,所以请耐心等待。如何处理JavaScript中的异步函数结果

留下async的优点,搁置一分钟, 比方说,我只是想从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()函数的值返回。

这是最简单的版本,如果我想从一个表retreive指数第一, 然后使用该指数在接下来的查询等什么...

这是正常的JavaScript开发者,我是否完全错误,是否有解决方案等...

+2

是的,你完全错了:-)为了处理事物的异步性,你需要传递* callback *函数。那些由运行时系统调用的时候需要这样做,所以从回调中返回值没有任何意义。 – Pointy 2012-02-24 12:15:59

+0

为了让getPicture返回一些东西,需要在异步内容完成之前阻止getPicture的执行,并使用异步回调来填充返回变量。 – Alex 2012-02-24 12:21:35

+0

@Pointy:考虑将你的评论升级到答案 – 2012-02-24 12:22:17

在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函数形式为关闭,它们可以访问调用上下文中的局部变量。也就是说,您传递给“getPicture()”的函数作为“whenFinished”参数将访问活动在“getPicture()”点的局部变量。