База данных Web SQL + цикл Javascript - PullRequest
7 голосов
/ 28 января 2011

Я пытаюсь это выяснить, но, похоже, не могу ...
Я играю с базами данных Web SQL и не могу заставить цикл работать с ним должным образом.
Я использую:

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

И я получаю только 5 ... Я не получаю добавочные значения i.
Может кто-нибудь подсказать, что я делаю не так и о чем я должен думать?

Ответы [ 2 ]

11 голосов
/ 28 января 2011

Сделайте наоборот:

<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);
    };
6 голосов
/ 28 января 2011

Похоже, что функция асинхронная, и что к моменту запуска 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
 };
...