db.transaction完成后的WebSQL递归循环

时间:2013-02-18 13:57:31

标签: javascript jquery cordova

我正在尝试循环从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函数完成之后才会再次调用它。关于什么是错的任何建议?有没有更好的方法呢?

0 个答案:

没有答案