6

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 クエリが終了するのを「待機」しないためだと思われるため、何らかのコールバック関数を使用する必要があります。しかし、うまくいきませんでした。

4

1 に答える 1

7

関数が非同期操作を実行する場合、それらの非同期操作の結果に基づいて値を返すことはできません。(これは、JavaScript のシングルスレッドの性質により、現在の実行が終了するまで非同期関数が実行されないためです。) 代わりに、関数は、戻り値を引数として受け取るコールバック関数を想定する必要があります。

現在、次のように関数を呼び出しています。

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

ただし、コールバックを使用する必要があります。

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

2 番目のコールバック引数を追加し、次を使用する代わりにそのコールバックを呼び出します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起動されます。isprimeprimecheck

于 2012-09-17T15:55:13.120 に答える