1

データベースからデータを取得しているときに、なぜ 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(
                '<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 に答える