为什么在从sqlite获取数据时,我自己增加了这个循环?

你能告诉我为什么当我从数据库中获取数据时,i的值会增加。 实际上我是从手机间隙中的表中获取数据。但是我还计算另一个表中的元素数量。而获取i的值会增加自己并获得错误。 项目索引超出范围。

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( '
  • ' + '' + '' + '

    ' + result.rows.item(i).CaseName + countDoument + '

    ' + '

    ' + result.rows.item(i).TextArea + '

    ' + '

    ' + result.rows.item(i).CaseDate + '

    ' + '
    ' + '
    ' + '
  • ' ); }); $('#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); }); }); }

    检查我的评论也.. !!

    您通过“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( '
  • ' + '' + '' + '

    ' + result.rows.item(i).CaseName + countDoument + '

    ' + '

    ' + result.rows.item(i).TextArea + '

    ' + '

    ' + result.rows.item(i).CaseDate + '

    ' + '
    ' + '
    ' + '
  • ' ); }; }(i));

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