了解 Javascript 异步调用

Understanding Javascript Asynchronous Calls

我在另一个问题中发布了大部分相同的代码,但我在这里有一个不同的问题 - 我应该如何理解 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 await 的帮助下做到这一点,async await 是编写异步代码的更简单、更清晰的方法。 async function getUserStatus() { var status; db.transaction(function (tx) { try { var result = await tx.executeSql('SELECT id FROM calculator ORDER by id ASC LIMIT 1'); var len = results.rows.length; var row = results.rows.item(0); console.log(row['id']); status = { question: row['id'] }; } catch (error) { console.log(err); } } }); }

希望对您有所帮助。