gpt4 book ai didi

for 循环中的 Javascript WebSQL 查询。如何知道何时完成?

转载 作者:数据小太阳 更新时间:2023-10-29 04:10:47 24 4
gpt4 key购买 nike

我想我有一个相对简单的问题,但我一直在思考,甚至​​谷歌也没有给我一个我可以使用的答案。

基本上,我正在尝试使用 WebSQL 复制一些存储在本地的记录。复制不是问题,但我需要知道所有复制操作何时完成才能继续我的程序。

WebSQL 调用是异步的,所以我通常做这些事情的唯一方法是使用回调函数。但是,因为查询是在 for 循环内完成的,所以我不能使用回调函数,因为它会在第一个完成的查询时触发,如代码所示。

代码如下:

function copyRecords(old_parent_id, new_parent_id, callback){
var db = openDatabase('test', '1.0', 'test', 50 * 1024 * 1024);
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM table WHERE parent_id = ?', [old_parent_id], function(tx, results){
for(var i = 0; i < results.rows.length; i++){
db.transaction(function (tx2) {
tx2.executeSql('INSERT INTO table (name, parent_id) VALUES (?, ?)', [results.rows.item(i).name, new_parent_id], callback);
})
}
});
});
}

我也试过在 i == results.rows.length 时调用回调函数,但这并不能确保所有查询都已完成。

我想你们中的一些人以前遇到过同样的问题,因此非常感谢任何有关如何解决此问题并确保仅在 for 循环完成时调用回调函数的帮助。

提前谢谢你。

最佳答案

通常的方法是使用递归异步回调来处理每个单独的记录,而不是 for 循环。

虽然还有更多记录,但异步回调会自行调用。当没有剩余记录时,它可以调用您提供的回调。

下面的代码将替换内部回调处理程序的内容:

(function nextRecord() {
var row = results.rows.shift();
if (row) {
db.transaction(function (tx2) {
tx2.executeSql('INSERT INTO table (name, parent_id) VALUES (?, ?)',
[row.item(i).name, new_parent_id], nextRecord);
});
} else {
callback();
}
})();

关于for 循环中的 Javascript WebSQL 查询。如何知道何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12913681/

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