2

最初の実行で異なるパフォーマンスを示すPhonegapアプリケーションを作成しています。私が最初の実行を検出する方法は、データベーステーブルの1つが存在することを確認することです。以下のコードからわかるように、(おそらく)テーブルがすでに存在することを示すエラーをチェックしているので、これがアプリケーションの最初の実行ではないことを証明しています。

function databaseExists(){
var exists;
database.transaction(function(tx){
    tx.executeSql('CREATE TABLE GLOBAL (uid, property, value)');
}, function(err){
    exists = true;
}, function(){
    exists = false;
});
return exists;
}

ただし、私の問題は、Javascriptコードの非同期実行は、成功(またはエラー)関数が値を設定する前に関数がその値を返すことを意味することです。

この関数は、アプリケーションの初期化段階で呼び出されます。

if (databaseExists()){
    // Do Something
}

したがって、トランザクションの成功コールバックで関数を実行するのではなく、値を返す必要があります。

データベーストランザクションが完了するまで実行を強制的に待機させる方法、またはdatabase.transactionオブジェクトを介して値を返す方法はありますか?

よろしくお願いします、ジョン

4

3 に答える 3

1

コールバック形式で記述する必要があります。

var dataBaseExists(yep, nope) {
  database.transaction(function(tx) {
    tx.executeSql('CREATE TABLE GLOBAL (uid, property, value)');
  }, function(){
    if (yep) {
      yep.apply(this, arguments);
    }
  }, function(){
    if (nope) {
      nope.apply(this, arguments);
    }
  });
};


var itDoes = function() {
  console.log("great");
};

var itDoesNot = function() {
  console.log("what a pity");
};


databaseExists(itDoes, itDoesNot);
于 2012-08-21T18:02:56.063 に答える
0

コールバックが必要ですが、テーブルの存在を確認する必要がない場合は、localStorage を使用して簡単に行うことができます。

例えば

if(localStorage.getItem('init') === null){
   //init
   localStorage.setItem('init', true);
}

データベースを扱うことを避けます。

そして多分これは役に立つでしょう「CREATE TABLE IF NOT EXISTS ...」

于 2012-08-21T18:14:19.547 に答える