2

我正在创建一个 Phonegap 应用程序,它在第一次运行时会以不同的方式执行。我检测第一次运行的方式是查看其中一个数据库表是否存在。正如您可能从下面的代码中看出的那样,我正在检查(可能)指示表已经存在的错误,从而证明这不是应用程序的第一次运行。

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);
}

您将避免处理数据库。

也许这会有所帮助“如果不存在则创建表......”

于 2012-08-21T18:14:19.547 回答
0

我知道会有程序员不喜欢我的解决方案,但我喜欢它!

var myfEspereti=false;

function Espereti(pStatus)
{
    if (pStatus==="wait")
    {
        myfEspereti = true;
        while(myfEspereti)
        {

        }
    }
    else if (pStatus==="go")
    {
        myfEspereti=false;
    }
}

然后在您想要等待异步调用时调用 Espereti(“等待”)。在异步调用中,当它完成时,调用 Espereti ("go") 就可以了!

于 2014-09-23T20:42:17.680 回答