har*_*nda 5 javascript callback web-sql
Primecheck函数应该返回true或false,无论传递的数字是否为素数.如果数字是素数,则函数将其添加到PRIMES表.这是Eratosthenes算法的Sieve,但还没有完成.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
问题:当我传递的数字不是以1,3,7,9结尾时,函数返回true,没关系.但是当我传递其他数字时,函数返回undefined.我想这是因为函数调用不会"等待"SQL查询完成,所以我必须使用某种回调函数.但它没有用.
如果您的函数执行异步操作,则它不能根据这些异步操作的结果返回值.(这是因为异步函数在当前执行完成之前不会运行,因为JavaScript具有单线程特性.)相反,您的函数应该期望一个回调函数将可能的返回值作为参数.
您目前将您的功能称为:
var isprime = primecheck(someNum);
// now do something with isprime
Run Code Online (Sandbox Code Playgroud)
但是你需要使用回调:
primecheck(someNum, function(isprime) {
// now do something with isprime
});
Run Code Online (Sandbox Code Playgroud)
只需添加第二个回调参数,并调用该回调而不是使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,primecheck什么都不返回,但是你传入的回调函数primecheck会isprime在primecheck确定输入的素数时被作为第一个参数触发.
| 归档时间: |
|
| 查看次数: |
7059 次 |
| 最近记录: |