私は現在JavaScriptオブジェクト指向を学んでおり、HTML5 SQLiteのDBクラスからリテラルオブジェクトを構築しようとしています.
問題は、ある時点で、いくつかのメソッドが正しい順序で実行されないということです。クラスは次のとおりです。
var DB = function(dbName, dbVersion, dbDescription, dbSize){
var dbConnection = null;
var is_connected = false;
var dbName = dbName;
var dbVersion = dbVersion;
var dbDescription = dbDescription;
var dbSize = dbSize;
var existingTables = new Array();
var connect = function(){
Debug.log('auto connect ...');
try{
if (!window.openDatabase) {
Debug.log('SQLite not supported');
}
else{
dbConnection = window.openDatabase(dbName, dbVersion, dbDescription, dbSize);
is_connected = true;
}
}
catch(e){
if (e == INVALID_STATE_ERR) {
// Version number mismatch.
Debug.log("Invalid database version.");
}
else{
Debug.log(e.message);
}
return;
}
}();
var checkTables = function(){
dbConnection.transaction(function (tx) {
tx.executeSql('SELECT name FROM sqlite_master WHERE type="table"', [], function(tx, rs) {
for( var i = 0; i < rs.rows.length; i++ ) {
Debug.log(rs.rows.item(i).name);
existingTables.push( rs.rows.item(i).name );
}
}, function (tx, err){
Debug.log(err.message);
return true;
});
});
}();
// public methods
return {
isConnected : function(){
return is_connected;
},
close : function(){
// close the DB connection
},
tableExists : function(table){
Debug.log('table: '+table);
// existingTables == 0 - WHY?
alert(existingTables.length);
},
tableCreate : function(table){
switch(table){
case 'foo':
var cr_sql = 'CREATE TABLE foo (id unique, text)';
break;
}
// create the missing table
dbConnection.transaction(function (tx) {
tx.executeSql(cr_sql, [], function(tx, rs) {
return true;
}, function (tx, err){
Debug.log(err.message);
return true;
});
});
},
dbConnection : dbConnection
}
};
実行:
var DBFactory = {
getConnectionforApp: function(){
try{
var db_instance = new DB('mydb', '1.0', 'DB Connection 1', 1024*1024);
Debug.log('Connected to db: '+db_instance.isConnected());
return db_instance;
}catch(e){
Debug.log(e.message);
}
}
};
// the example
var dbObj = DBFactory.getConnectionforApp();
alert(dbObj.tableExists('foo'));
このコードを実行すると、パブリック メソッド tableExists によって、 existingTables.length = 0 であるというアラートが表示されますが、この配列内のすべての既存のテーブルを関数内のオブジェクトから最初に追加しています: checkTables()。
- 関数 tableExists でこの配列 existingTables が空なのはなぜですか?
- 関数 tableExists が関数 checkTables の前に実行されるのはなぜですか?
他のすべての関数の前に、オブジェクトの作成時に最初に呼び出されるconstruct()関数を作成する可能性はありますか?