7

私はこれを理解しようとしていますが、自分では理解できないようです...
Web SQL DBで遊んでいて、ループを正しく機能させることができません。
私が使う:

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

そして、私は5だけを取得します。増分i値を取得しません。
誰かが私が間違っていることと私が考えるべきことを提案できますか?

4

2 に答える 2

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);
    };
于 2011-01-28T06:50:00.447 に答える
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
 };
于 2011-01-28T06:52:10.453 に答える