理解Javascript异步调用

理解Javascript异步调用,javascript,function,asynchronous,Javascript,Function,Asynchronous,我在另一个问题中发布了大部分相同的代码,但我有一个不同的问题-我应该如何理解Javascript异步代码 function getUserStatus() { var status; function querySuccess(tx, results) { var len = results.rows.length; var row = results.rows.item(0); console.log(row['id']);

我在另一个问题中发布了大部分相同的代码,但我有一个不同的问题-我应该如何理解Javascript异步代码

function getUserStatus() {

    var status;

    function querySuccess(tx, results) {
        var len = results.rows.length;
        var row = results.rows.item(0);
        console.log(row['id']);
        status = {
            question: row['id']
        };
    }

    function errorCB(err) {
        console.log(err);
    }

   db.transaction(function(tx) {
        tx.executeSql('SELECT id FROM calculator ORDER by id ASC LIMIT 1', [], querySuccess, errorCB);
    });
    querySuccess();
    console.log(status);
    return status;
}
我知道我的代码是在定义变量状态之前执行的,但是在定义状态之前我如何停止处理?我不希望这个过程是异步的——如果没有从数据库中传递任何内容,那么我不希望操作继续

我的印象是我需要调用querySuccess(),但是我会传递什么参数给它呢


我对Javascript比较陌生,以前也没有遇到过这个概念,我对它的工作原理以及如何让代码按我所希望的方式执行有些困惑。

当我第一次学习异步编程时,我发现将匿名函数作为回调传递比较容易:

function getUserStatus(returnCallback) {
    db.transaction(function(tx) {
        tx.executeSql('SELECT id FROM calculator ORDER by id ASC LIMIT 1', [], 
            function(tx, results) { //querySuccess callback
                var len = results.rows.length;
                var row = results.rows.item(0);
                console.log(row['id']);
                var status = {question: row['id']};
                console.log(status);
                returnCallback(status);
            }, 

            function(err) { //error callback
               console.log(err);
               returnCallback(err);         
            });
    });
}
我重写了一些东西并添加到您的代码中。希望这能有所帮助:)

不幸的是,我现在没有时间详细解释这一切是如何运作的。如果其他人想编辑此答案以实现此目的,请直接进行


祝你好运,OP,学习使用异步技术一开始很困难,但只要你能集中注意力,就很容易了:)

我们可以借助async Wait来完成这项工作,async Wait是一种更简单、更清晰的异步代码编写方法。 异步函数getUserStatus(){ var状态; 数据库事务(功能(tx){ 试一试{ var result=await tx.executeSql('SELECT id FROM calculator ORDER by id ASC LIMIT 1'); var len=results.rows.length; 变量行=结果行项目(0); log(第['id']行); 状态={ 问题:第['id'行] }; }捕获(错误){ 控制台日志(err); } } }); }


我希望这会有所帮助。

它始终是异步的。您不需要自己调用
querySuccess
,查询完成后会自动调用它。将
console.log()
调用放入
querySuccess()
中。依赖于查询成功完成的所有内容都应该在
querySuccess()
函数中。您无法从函数返回
状态
。Uncaught TypeError:undefined不是一个函数我花了相当长的时间来处理这个函数,但我最终理解了它,并通过一些额外的阅读获得了正确的回调。谢谢你的帮助。