websql used the opendatabase mdn example javascript callback web-sql

javascript - opendatabase - which function is used to connect to the websql database



Realizar llamada de funciĆ³n esperar consulta web SQL (1)

Se supone que la función Primecheck devuelve verdadero o falso, ya sea que el número pasado sea primo o no. Si el número es primo, la función lo agrega a la tabla PRIMES. Este es un algoritmo de Tamiz de Eratóstenes, pero aún no está terminado.

function primecheck (number) { var isprime = true; if (number%10 == 1 || number%10 == 3 || number%10 == 7 || number%10 == 9) { db.transaction(function (tx) { tx.executeSql(''SELECT * from Primes'', [], function (tx, result) { for (var i = 1; i < result.rows.length; i++) { if (number%result.rows.item(i)[''prime''] == 0) { isprime = false; break; } } if (isprime) { tx.executeSql(''INSERT INTO PRIMES (prime) values (?)'', [number]); } return isprime; }, null); }, null, null); } else { isprime = false; return isprime; } }

Problema: cuando paso números que no terminan el 1, 3, 7, 9, la función devuelve verdadera, está bien. Pero cuando paso otros números, la función devuelve indefinido. Supongo que es porque la llamada a la función no "espera" a que finalice la consulta SQL, así que debo usar algún tipo de funciones de devolución de llamada. Pero no funcionó.


Si su función realiza operaciones asíncronas, no puede devolver un valor basado en el resultado de esas operaciones asincrónicas. (Esto se debe a que las funciones asíncronas no se ejecutarán hasta que finalice la ejecución actual, debido a la naturaleza de subproceso único de JavaScript). En su lugar, su función debe esperar una función de devolución de llamada que tome el posible valor de retorno como argumento.

Actualmente llama a su función como:

var isprime = primecheck(someNum); // now do something with isprime

Pero necesitas usar una devolución de llamada:

primecheck(someNum, function(isprime) { // now do something with isprime });

Simplemente agregue un segundo argumento de devolución de llamada y llame a esa devolución de llamada en lugar de usar un return :

function primecheck (number, callback) { var isprime = true; if (number%10 == 1 || number%10 == 3 || number%10 == 7 || number%10 == 9) { db.transaction(function (tx) { tx.executeSql(''SELECT * from Primes'', [], function (tx, result) { //.... callback(isprime); }, null); }, null, null); } else { isprime = false; callback(isprime); } }

Ahora, primecheck no devuelve nada, pero la función de devolución de llamada que pasa a primecheck se isprime con isprime como su primer argumento siempre que primecheck determine la primalidad de la entrada.