2012-09-17 1 views
4

Primecheck 함수는 전달 된 숫자가 소수인지 아닌지 여부를 true 또는 false로 반환해야합니다. 숫자가 소수 일 경우 함수는이를 PRIMES 테이블에 추가합니다. 이것은 시브 오브 에라토스테네스 알고리즘이지만 아직 완료되지 않았습니다.웹 SQL 쿼리를위한 함수 호출 대기

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 쿼리가 끝나기를 기다리지 않기 때문에 콜백 함수를 사용해야합니다. 그러나 그것은 효과가 없었습니다.

+0

'primecheck'의 두 번째 인수로 콜백을 전달하고'return isprime' 대신'callback (isprime)'을 실행하십시오. (또한'sqrt (number)'보다 큰 소수를 선택할 필요가 없습니다. – DCoder

답변

6

함수가 비동기 작업을 수행하는 경우 비동기 작업의 결과에 따라 값을 반환 할 수 없습니다. (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을 첫 번째 인수로 발생시킵니다.

+0

그것은 일했다! 감사. – harryfonda

+0

이것은 나에게도 효과가있다. 고마워! –