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

标签 javascript html sqlite

由于我有 C# 背景,我可能从完全错误的 Angular 看待 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 - 如何处理 JavaScript 中的异步函数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9430551/

相关文章:

getReadableDatabase 上的 android 空指针异常

javascript - Jest |测试 moment 函数是否被调用以及返回输出是否正确

javascript - 这段 Javascript 是怎么回事?

sql - HTML Local Storage 参数替换转义

javascript - 从 html anchor 元素传递窗口对象

html - 为什么我必须将 left 和 right 设置为 0 才能使控件水平居中?

android - cursor.getType() 和 CursorIndexOutOfBoundsException 异常

android - 正确关闭我的数据库

javascript - 通过 Javascript 语法从 JSON 对象读取

javascript - 单击按钮刷新动画 Gif