Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中处理异步函数结果_Javascript_Html_Sqlite - Fatal编程技术网

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

如何在JavaScript中处理异步函数结果,javascript,html,sqlite,Javascript,Html,Sqlite,我来自c#背景,可能从一个完全错误的角度看待JavaScript,所以请容忍我 将异步的优点放在一边一分钟, 假设我只想在HTML5页面中从SQLite数据库检索一个值。 我想看到的是 var something = db.getPicture(1); 现在考虑一个(也许很幼稚)的实现: this.getPicture(id) { this.database.transaction(function(tx) { tx.executeSql('SELECT ...

我来自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()”方法的函数

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


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

是的,您完全错了:-)为了处理事物的异步性质,您传递了回调函数。运行时系统会在需要时调用这些函数,因此从回调返回值没有任何意义。要让getPicture返回某些值,需要在异步操作完成之前阻止getPicture的执行,使用异步回调填充返回变量。@ PosiTy:考虑将注释升级为answer@KeesdeKooter这确实是一个非常常见的问题;我一直在找一个好的复制品。
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);
        }
    },