如何在JavaScript中处理异步函数结果
How to deal with async function results in JavaScript
来自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开发人员来说是正常的吗,我做得完全错了吗,有解决方案吗等等…
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()"时活动的局部变量。
相关文章:
- 如何在异步函数中使用javascript对象
- Meteor:异步函数回调异常:onAfterAction
- 未调用jquery异步函数
- 使用来自不同异步函数的响应创建一个json对象
- 如何在异步函数中正确使用Promise.all()和then()
- 从异步函数返回值
- 如何按照承诺使用mocha/chai/chai测试ES7异步函数
- 如何在将Node异步函数转换为promise时使用Q库
- 如何在异步函数与Deferredjquery之间同步
- ng用异步函数模拟怪异行为
- 用mocha测试异步函数
- 用于异步函数中的循环和定时问题
- Node.js设计:多个异步函数使用作为闭包传递的函数写入数据库
- 嵌套异步函数未及时返回数据的问题
- 在异步函数中维护变量的状态
- 递归异步函数
- Bluebird promisifyAll不会创建整个异步函数集
- 递归调用异步函数
- 异步函数调用是否可以在两个同步语句之间完成
- 如何在nodejs中实现异步函数