2013-12-03 3 views
2

SQLite를 사용하여 SQL 쿼리의 결과를 반환하려고합니다. 쿼리가 제대로 작동하고 결과를 executeSql 함수 내에 출력 할 수 있습니다. 하지만 내 주요 함수 (returnSQLArray)에서 배열에 도달하려고하면 정의되지 않습니다. 이 문제를 어떻게 해결합니까?return executeSQL 함수

나는 쿼리의 결과가 필요한 다른 함수 내에서 returnSQLArray를 호출하고있다.

코드 :

function returnSQLArray(str) 
{ 
    var db = window.openDatabase("Database", "1.0", "Name", 200000); 
    var result = []; 
    db.transaction(
     function (tx, results) { 
      tx.executeSql(str, [], function(tx, rs) { 
       for(var i=0; i<rs.rows.length; i++) { 
         var row = rs.rows.item(i) 
         result[i] = { 
          id: row['id'] 
         } 
       } 
       console.log(result[0].id); //Returns the id 
      });     
     } 
    ); 
    console.log(result[0].id); //Undefined  
} 

당신

답변

1

감사 그것은 비동기 문제입니다. db.transaction은 sqlite 트랜잭션이 끝난 후 실행되는 콜백을 사용합니다. 메서드 끝에 표시된 console.log() 문이 실제로 발생하여 result이 채워집니다.

편집 ADDITION :

functions getPersons() { 
    returnSQLArray('SELECT * FROM PERSONS', processPersonsResponse); 
} 

function returnSQLArray(str, callback) { 
    ... 
    tx.executeSql(str, [], function(tx, rs) { callback(result); }); 
} 

function processPersonsResponse(response) { 
    //do work with response 
} 
+0

가 나는 경우라고 걱정했다. 이 문제를 해결할 여지가 있습니까? 사람들이 비동기 문제를 피하기 위해 setTimeout 메서드를 사용한 몇 가지 솔루션을 보았습니다. 더 좋은 방법이 있습니까? – user1698462

+0

에는 콜백 내부에서 필요한 모든 작업을 수행 할 수없는 이유가 있습니까? – EkoostikMartin

+0

내가 호출 한 곳에서 결과 배열을 사용해야한다. 예 : getPersons 함수 내에서 returnSQLArray ('SELECT * FROM PERSONS')를 호출 한 다음 나중에 함수 내부에서 배열을 사용하려고합니다. 콜백 함수에서 반환 할 수 없습니까? – user1698462

관련 문제