了解Javascript异步调用

Understanding Javascript Asynchronous Calls

本文关键字:调用 异步 Javascript 了解      更新时间:2023-10-03

我在另一个问题中发布了大部分相同的代码,但我有一个不同的问题——我应该如何理解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 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); } } }); }

我希望这会有所帮助。