Phonegap等待数据库事务完成

时间:2012-08-21 17:20:52

标签: javascript ios database cordova wait

我正在创建一个在首次运行时执行不同的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对象返回值?

提前致谢, 乔恩

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您需要回调,但如果不需要检查表的存在,则可以使用localStorage轻松完成。

e.g。

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

您将避免处理数据库。

也许这会有所帮助“CREATE TABLE IF NOT NOT EXISTS ...”

答案 2 :(得分:0)

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

var myfEspereti=false;

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

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

然后在您要等待异步调用时调用Espereti(" wait")。在异步通话中,当它完成后,请致电Espereti("去"),那就是它!