2012-09-10 1 views
0

내 코드가 phonegap 응용 프로그램에 있습니다. SELECT SQL 문을 실행하는 동안 부모 함수의 변수에 결과를 전달하는 데 어려움이 있습니다. 코드는 다음과 같습니다.중첩 함수 구조의 JavaScript 부모 함수 변수에 액세스

function db_data(query) { 
var result_out; 
db.transaction(function (tx) { 
    tx.executeSql(query, [], function (tx, results) { 
     console.log("RETURNED SUCCESSFUL RESULTS"); // SUCCESSFULLY EXECUTING HERE. 
     result_out = results.rows; 
    }, function(){ 
     console.log("Error on executing sql"); 
     result_out = false; 
    }); 
}); 
console.log(result_out); // NOTHING LOGGING HERE. 
return result_out; 
} 

이 함수는 일반적인 SELECT 문을 전달합니다. 함수가 아무 것도 반환하지 않고 반환하는 객체가 SQL 실행 함수 내에서만 성공적으로 기록됩니다.

+0

'result.rows'에는 뭔가가 있습니까? console.log에 그 값을 주려고 했습니까? –

+0

결과를 함수에 기록합니다. – IvenMS

답변

1

작업이 비동기입니다. db.transaction 내부의 작동은 나중에 적용될 수 있습니다. 결과를 기록 할 때까지는 아직 없습니다. 당신이 result_out에 대한 값을 얻기 후에 뭔가를 실행하려면

, 당신은 콜백 안에 넣어해야합니다

function db_data(query,callback) { 
    var result_out; 
    db.transaction(function (tx) { 
     tx.executeSql(query, [], function (tx, results) { 
      console.log("RETURNED SUCCESSFUL RESULTS"); // SUCCESSFULLY EXECUTING HERE. 
      callback.call(this,results.rows); 
     }, function(){ 
      console.log("Error on executing sql"); 
      callback.call(this,false); 
     }); 
    }); 
} 

대신

var result = db_data('your query'); 
//do something with result 

의, db_data를 사용하는 경우 대신

을 이렇게
db_data('your query',function(result){ 
    //do something with result here 
    //result will either be a false or the result 
}); 
+0

감사합니다. 작동합니다. – IvenMS

1

db 조작이 비동기이기 때문입니다. 값 result_out은 sql이 실행되기 전에 인쇄됩니다. db_data에 대한 콜백 함수를 제공해야합니다.

function db_data(query, callback) { 
    var result_out; 
    db.transaction(function (tx) { 
    tx.executeSql(query, [], function (tx, results) { 
     console.log("RETURNED SUCCESSFUL RESULTS"); // SUCCESSFULLY EXECUTING HERE. 
     callback(null, result.rows); // <<<<<<<<<<< 
    }, function(){ 
     callback(new Error('error executing sql')); // <<<<<<<<<<<<< 
    }); 
    }); 
} 

db_data('select * ....', function (err, rows) { 
    // do something with rows 
}) 
+0

감사합니다. 두 답변이 같습니다. – IvenMS