1

你能告诉我为什么当我从数据库中获取数据时我的价值会自己增加吗?实际上,我正在从电话间隙中的表中获取数据。但同时我还计算了另一个表中的元素数量。同时获取我自己增加的值并得到一个错误。项目索引超出范围。

function getallTableData(tx) {

    tx.executeSql('SELECT * FROM CaseTable', [], querySuccess, errorCB);
}

function querySuccess(tx, result) {

    var len = result.rows.length;
    var countDoument = 0
    $('#folderData').empty();
    for (var i = 0; i < len; i++) {

        alert(i) // here value is i =0

        test1 = result.rows.item(i).CaseName;



        Test1(test1, function (result_count) {
            countDoument = result_count; // here it count value 
            alert(result_count + "result_count") //alert is correct count value
            alert(i + "i"); //here i comes 1 why ? it should be 0

            $('#folderData').append(
                '<li class="caseRowClick" id="' + result.rows.item(i).id + '" data-rel="popup" data-position-to="window">' + '<a href="#">' + '<img src="img/Blue-Folder.png">' + '<h2>' + result.rows.item(i).CaseName + countDoument + '</h2>' + '<p>' + result.rows.item(i).TextArea + '</p>' + '<p>' + result.rows.item(i).CaseDate + '</p>' + '</a>' +
                '<span class="ctrl togg"><fieldset data-role="controlgroup" data-type="horizontal" data-mini="true" ><button class="edit button_design">Edit</button><button class="del button_design">Delete</button></fieldset><span>' + '</li>'
            );

        });

        $('#folderData').listview('refresh');




    }


}

function Test1(test, callBack) {
    var x;
    db.transaction(function (tx) {
        $yoursql = 'SELECT * FROM  "' + test + '" ';
        tx.executeSql($yoursql, [], function (tx, results) {
            x = results.rows.length + "TableName" + test;
            callBack(x);
        });
    });

}

也检查我的评论.. !!

4

1 回答 1

1

您通过“Test1”传递给数据库函数的回调不会立即被调用。稍后在数据库操作完成时调用它。到那时,“i”已经增加了。

如果您想保留“i”的值,就像数据库操作开始时一样,您必须复制它。在 JavaScript 中执行此操作的方法是将匿名函数包装在另一个匿名函数中,如下所示:

    Test1(test1, function(i) {
      return function(result_count) {
        countDoument = result_count; // here it count value 
        alert(result_count + "result_count") //alert is correct count value
        alert(i + "i"); 

        $('#folderData').append(
            '<li class="caseRowClick" id="' + result.rows.item(i).id + '" data-rel="popup" data-position-to="window">' + '<a href="#">' + '<img src="img/Blue-Folder.png">' + '<h2>' + result.rows.item(i).CaseName + countDoument + '</h2>' + '<p>' + result.rows.item(i).TextArea + '</p>' + '<p>' + result.rows.item(i).CaseDate + '</p>' + '</a>' +
            '<span class="ctrl togg"><fieldset data-role="controlgroup" data-type="horizontal" data-mini="true" ><button class="edit button_design">Edit</button><button class="del button_design">Delete</button></fieldset><span>' + '</li>'
        );
      };

    }(i));

请注意,在最后一行,包装函数被调用并传递了“i”的值。包装函数返回您的原始函数,因此“Test1”仍然传递相同的东西。不同之处在于,现在您的原始函数内置在包装器中,并且包装器拥有自己的“i”私有副本。当数据库事务完成并调用您的函数时,“i”的副本仍将具有操作开始时的值。

于 2013-07-20T14:33:27.343 回答