2012-09-10 204 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); 
     }); 
    }); 
} 

使用DB_DATA的時候,而不是

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

做到這一點,而不是

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

謝謝,它的工作原理。 – IvenMS

1

這是因爲數據庫操作是異步的。在sql執行之前打印值result_out。您應該爲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