【问题标题】:Make function call wait for web SQL query使函数调用等待 Web SQL 查询
【发布时间】:2012-09-17 14:53:58
【问题描述】:

无论传递的数字是否为素数,Primecheck 函数都应该返回 true 或 false。如果数字是素数,函数将其添加到 PRIMES 表中。 这是一个埃拉托色尼筛算法,但还没有完成。

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

问题:当我传递不以 1、3、7、9 结尾的数字时,函数返回 true,没关系。 但是当我传递其他数字时,函数返回未定义。我想这是因为函数调用不会“等待”SQL 查询完成,所以我必须使用某种回调函数。但它没有用。

【问题讨论】:

  • 将回调作为primecheck 的第二个参数传递,并执行callback(isprime) 而不是return isprime。 (另外,您不需要选择大于sqrt(number) 的素数)。

标签: javascript callback web-sql


【解决方案1】:

如果您的函数执行异步操作,则它无法根据这些异步操作的结果返回值。 (这是因为由于 JavaScript 的单线程特性,异步函数在当前执行完成之前不会运行。)相反,您的函数应该期望一个回调函数,该函数将可能的返回值作为参数。

你当前调用你的函数如下:

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

但是你需要使用回调:

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

只需添加第二个回调参数,然后调用该回调而不是使用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);
    }
}

现在,primecheck 不返回任何内容,但只要primecheck 确定输入的素数,您传递给primecheck 的回调函数就会以isprime 作为其第一个参数被触发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多