use*_*815 8 javascript for-loop web-sql
我想我有一个相对简单的问题,但我一直在思考,甚至谷歌也没有给我一个我可以使用的答案.
基本上我试图复制一些使用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);
})
}
});
});
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过调用回调函数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();
}
})();
Run Code Online (Sandbox Code Playgroud)