1

これがJavascriptによって書かれたforループです。websqlにクエリを適用しようとしています。

for (var i = 0; i < 10; i++){
    db.transaction(function (tx){
    tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]);
    });
}

その試みは明らかです。テーブルProjSetsTの列ProjIDに値「0、1、2、...9」を追加しようとしました。それは動作しません。最後の要素、つまり「9」だけが挿入されましたが、最初の8つの数字は挿入されていません。

構文エラーはありますか?

4

3 に答える 3

4

db.transaction非同期で実行される可能性があるため、混乱する可能性があります。for ループをトランザクション内に移動しようとしましたか?

db.transaction(function (tx){
    for (var i = 0; i < 10; i++){
        tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]);
    }
});
于 2012-09-25T15:38:36.470 に答える
2

引数として渡すすべての関数は への同じ参照を共有するiため、すべての新しい関数オブジェクトのi値がインクリメントされます。非同期コンテキストが与えられた場合i、ループ内で作成した最初の関数が呼び出される前に最大サイズに達します

クロージャーを使用して修正できます。

for (var i = 0; i < 10; i++)
{
    db.transaction((function(privateI)
    {//privateI is unique for every function object
        return function (tx)
        {
            tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [privateI]);
        };
    })(i));//pass current value here
}
于 2012-09-25T15:40:32.060 に答える
1

i同じ変数を参照するいくつかの関数があり、最終的には10.

関数ごとに新しい可変スコープが必要です。

for (var i = 0; i < 10; i++){
    db.transaction(makeHandler(i));
}

function makeHandler(j) {
    return function (tx){
        tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [j]);
    };
}

iは に渡されmakeHandler、 は として受け取りますj

が呼び出されるたびmakeHandlerに、独自のローカルj変数を参照する関数を返します。

于 2012-09-25T15:38:40.400 に答える