2011-01-28 13 views
7

que estoy tratando de resolver esto, pero parece que no puede por mi cuenta ...
estoy jugando con SQL Web DB y no puedo conseguir un bucle para que funcione correctamente con eso.
que utilizo:Web Base de datos SQL + Javascript bucle

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

y me sale solo el 5 de .. No entiendo los valores I incrementales.
¿Puede alguien sugerir qué estoy haciendo mal y en qué debería estar pensando?

Respuesta

6

Parece que la función es asíncrona, y que en el momento en que tx.executeSql incendios, el bucle ha terminado de bucle y i se ha cambiado varias veces.

Puede resolver esto con un cierre.

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 Podría explicar un poco la sintaxis (no el javascript del WebSQL)? Especialmente la línea "} (i); // <- CALL la función". Quiero decir, podría copiar el código, pero me gustaría entenderlo completamente. –

+4

Llama a una función pegando '(any args)' al final de ella. 'function() {}()' es como 'function foo() {}; foo(); 'excepto que no mantiene' foo' para su uso posterior. – Quentin

+0

@David Dorward Ya veo, gracias. –

11

hacerlo al revés:

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

Y la alternativa, la forma correcta con el bucle exterior que es innecesario en este caso

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