2011-01-28 19 views
7

Sto cercando di capirlo ma non riesco a trovarlo da solo ...
Sto giocando con DB Web SQL e non riesco a far funzionare correttamente un ciclo con esso.
Io uso:Database SQL Web + ciclo Javascript

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

e ottengo solo 5 di .. Non capisco il incrementale valori i.
Qualcuno può suggerire cosa sto sbagliando e cosa dovrei pensare?

risposta

6

Sembra che la funzione è asincrona, e che quando viene attivato tx.executeSql, il ciclo ha terminato il ciclo e i è stato modificato più volte.

È possibile risolvere questo con una chiusura.

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 La prego di spiegare un po 'la sintassi (la non javascript il WebSQL)? Soprattutto la riga "} (i); // <- CHIAMATA la funzione". Voglio dire, potrei semplicemente copiare il codice, ma mi piacerebbe capirlo perfettamente. –

+4

Si chiama una funzione attaccando '(any args)' alla fine di esso. 'function() {}()' è come 'function foo() {}; foo(); 'eccetto che non mantiene' foo' around per un uso successivo. – Quentin

+0

@David Dorward Vedo, grazie. –

11

farlo nel contrario:

<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> 

e l'alternativa, il modo corretto con il ciclo esterno che non è necessaria in questo caso

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