我正在尝试遍历从 a 返回的一组结果db.transaction
。在这个循环中,我将 html 内容附加到一个 JavaScript 变量中,一旦循环完成,它就会使用 jQuery 的html()
函数添加到 DOM 中。这按预期工作。
问题是在循环期间,我正在进行另一个db.transaction
查询。我遇到的问题是第二个查询(循环内)在移动到循环的下一次迭代之前没有完成。
我最初使用for()
循环,但认为这是导致问题的原因,因为 for 循环无法知道db.transaction
循环内的循环是否已完成。
所以我决定使用递归循环,如下所示:
var html_content = '<table class="booking-table"><tbody>';
var i = 0;
function getPhotoCountForSyncItemSuccessRecursive(i){
html_content += "More HTML content, not relevant"
localStorage.setItem("current_row_booking_id", results.rows.item(i).id);
i++;
db.transaction(getPhotoCountForSyncItem, getPhotoCountForSyncItemFailRecursive, getPhotoCountForSyncItemSuccessRecursive(i));
if (i == results.rows.length){
html_content += '</tbody></table>';
$('.booking-items-wrapper').html(html_content);
}
}
getPhotoCountForSyncItemSuccessRecursive(i);
因此,首先我设置了 2 个变量,一个用于保存 html 内容(html_content),另一个用于保存当前结果的计数(i)
接下来是getPhotoCountForSyncItemSuccessRecursive()
接受一个参数的函数声明,即当前计数 ( i )。在这个函数之后,我正在调用该函数来启动递归循环。
在函数中,我正在对 html_content 变量进行大量附加(此处未显示,因为它无关紧要)。然后我设置一个localStorage
名为current_row_booking_id
的值,该值具有当前结果 id 的值(不久将在第二个查询中使用)。
然后我增加计数,并调用函数的递归部分:
db.transaction(getPhotoCountForSyncItem, getPhotoCountForSyncItemFailRecursive, getPhotoCountForSyncItemSuccessRecursive(i));
如您所见,我调用了一个函数getPhotoCountForSyncItem
,并在成功时调用递归函数getPhotoCountForSyncItemSuccessRecursive(i)
(创建我的循环)
我的getPhotoCountForSyncItem
(以及它的成功和失败回调)看起来像:
function getPhotoCountForSyncItem(tx){
tx.executeSql("SELECT * FROM booking_photo WHERE booking_id = '" + localStorage.getItem("current_row_booking_id") + "'", [], getPhotoCountForSyncItemSuccess, getPhotoCountForSyncItemFail);
}
function getPhotoCountForSyncItemFail(tx, results){
console.log("getPhotoCountForSyncItemFail");
localStorage.removeItem("current_row_booking_id");
}
function getPhotoCountForSyncItemSuccess(tx, results){
if (results.rows.length == 0){
console.log('no photos');
localStorage.removeItem("current_row_booking_id");
} else {
console.log('got photos ' + results.rows.length);
localStorage.removeItem("current_row_booking_id");
}
}
我遇到的问题是递归函数( ),只有在函数完成后getPhotoCountForSyncItemSuccessRecursive
才能再次调用它,然后再触发。getPhotoCountForSyncItem
关于什么是错的任何建议?有没有更好的方法来做到这一点?