gpt4 book ai didi

javascript - 与内部另一个事务同步的 WebSQL 事务

转载 作者:行者123 更新时间:2023-11-30 17:19:14 24 4
gpt4 key购买 nike

我知道我无法同步检索交易的值(value)。我读到另一种方法是回调函数。但我做不到。这是我在函数中插入第二笔交易的片段。

for(...){
db.transaction(function(tx) {
tx.executeSql('SELECT ...', function(tx, results) {
...
...
weight = weightRetrieve(month, year);
calories = 0.9 * km * weighta;
});
update+=xxx+calories+yyy;
} //for end

$("#form").html(update).trigger('create');

这是第二个函数:

function weightRetrieve(month, year) {
db.transaction(function(tx) {
tx.executeSql('SELECT weight,day, ......etc) {

weight=results.rows.item(i).weight;
return weight;
}
}

我删掉了很多代码,但我面临的唯一问题是我无法通过这种方式或在第一个事务中检索第二个函数的权重,因为如果异步工作

如果我用 localStorage 存储值,那编程会很糟糕吗?

最佳答案

作为一般规则,如果您使用异步调用,尝试“返回”一个值不会给您带来多大好处。外部函数通常在内部异步函数将任何数据放入变量之前就已经完成执行并返回变量,因此您最终会返回一个空变量。此外,在您的情况下,您的“返回”是从您传递给 db.transaction 而不是 weightRetreive 的匿名函数返回。

您需要传入一个回调函数作为参数,然后在获得该值后调用该回调函数。

例如:

function weightRetrieve(month, year, onSuccess) {
db.transaction(function(tx) {
tx.executeSql('SELECT weight,day, ......etc', [], function(tx, results) {

weight=results.rows.item(i).weight;
onSuccess(weight);

});
});
}

注意添加参数“onSuccess”作为回调函数。

因为这一切都在一个 for 循环中,所以您需要让每次迭代都有机会完成并将其“卡路里”计算添加到您的最终累积值,然后再继续。为此,您可以创建一个在每次迭代结束时调用的函数,该函数会跟踪它被调用的次数,并将其与执行最终代码之前要循环的内容的长度进行比较:

var updateFinalValue = (function() {

var numCalls = 0; // number of times the function has been called
var totalIterations = thingYouLoopOver.length; // number of times the for loop will run
var finalValue = 0; // total of all your "calories" calculations

return function(additionalValue) {

finalValue += additionalValue;

if(++numCalls == totalIterations ) {

document.getElementById("totalCalories").value = finalValue;
doSomethingWithFinalValue(finalValue);
// etc
}
};
})();

如果您不太熟悉 javascript,语法可能看起来有点奇怪,但它是在您调用“updateFinalValue”时执行的返回内部函数。立即评估外部函数(注意最后的“();”——我们就地调用外部函数)并且纯粹用于为内部函数提供范围。这被称为“闭包”,除其他外,这是一种封装变量的好方法,而不必使它们成为全局变量。

然后您将按如下方式使用它:

for(...) {
db.transaction(function(tx) {
tx.executeSql('SELECT ...', [], function(tx, results) {
...
...
weightRetrieve(month, year, function(weight) {

var calories = 0.9 * km * weight;
updateFinalValue(calories);

});
});
});
}

关于javascript - 与内部另一个事务同步的 WebSQL 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25473023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com