2011-01-28 16 views
7

私はこれを理解しようとしていますが、自分では見えません。
Web SQLデータベースで再生していて、ループが正常に動作しませんそれと。
私が使用:Web SQLデータベース+ Javascriptループ

for (var i=0; i<=numberofArticles-1; i++){ 
    db.transaction(function (tx) { 
    tx.executeSql('INSERT INTO LOGS (articleID) VALUES (?)', [i]); 
    }); 
}; 

そして、私は唯一の5のを取得..私は、増分i値を得ることはありません。
誰かが私が間違っていることを提案し、私が何を考えなければならないのでしょうか?

答えて

6

では不要ですtx.executeSqlが起動するまでにループがループし、iが何回か変更されたことを示します。

これはクロージャで解決できます。

for (var i=0; i<=numberofArticles-1; i++){ 
    function (value) { 
     db.transaction(function (tx) { 
     tx.executeSql('INSERT INTO LOGS (articleID) VALUES (?)', [value]); 
     }); 
    }(i); // <-- CALL the function 
}; 
+0

@David Dorward あなたは少しsintax(javascriptではなくwebsql)を説明してください。特に行 "}(i); // < - 関数を呼び出す"。つまり、私はコードをコピーすることができますが、私はそれを完全に理解したいと思います。 –

+4

関数の最後に '(任意のargs)'を貼り付けて関数を呼び出します。 'function(){}()'は 'function foo(){}のようになります。 foo(); '後で使用するために' foo'を保持しない点を除いて。 – Quentin

+0

@David Dorward私は、ありがとう。 –

11

はそれを他の周りの道行います

<script> 
    numberofArticles = 5; 
    db = openDatabase("websql", "0.1", "web-sql testing", 10000); 
    db.transaction(function(tx) { 
     tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, articleID int)'); 
    }); 
    db.transaction(function (tx) { 
     for (var i=0; i<=numberofArticles-1; i++){ 
      tx.executeSql('INSERT INTO LOGS (articleID) VALUES (?)', [i]); 
     }; 
    }); 
</script> 

や代替を、ループとの適切な方法は、外で、この場合関数は非同期であるように見えます

for (var i=0; i<=numberofArticles-1; i++){ 
     (function(i) { 
     db.transaction(function (tx) { 
       tx.executeSql('INSERT INTO LOGS (articleID) VALUES (?)', [i]); 
     }); 
     })(i); 
    }; 
関連する問題