我在另一个问题中发布了大部分相同的代码,但我在这里有一个不同的问题 - 我应该如何理解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比较陌生,之前我还没有遇到过这个概念,我对它的运作方式以及如何让我的代码执行我想要的方式感到有些困惑。 / p>
答案 0 :(得分:2)
当我第一次学习异步编程时,我发现将匿名函数作为回调传递更容易:
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,一开始学习使用异步技术很困难,但是一旦你可以把它包围起来就很容易:)
答案 1 :(得分:0)
我们可以在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);
}
}
});
}
我希望这会有所帮助。