我正在尝试循环从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
的{{1}}值,其值为当前结果ID(并在短时间内用于第二个查询)。
然后我递增计数,并调用函数的递归部分:
current_row_booking_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
函数完成之后才会再次调用它。关于什么是错的任何建议?有没有更好的方法呢?