【问题标题】:Phonegap wait for database transaction to completePhonegap 等待数据库事务完成
【发布时间】:2012-08-21 17:20:51
【问题描述】:

我正在创建一个 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对象返回值?

提前致谢, 乔恩

【问题讨论】:

    标签: javascript ios database cordova wait


    【解决方案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);
    

    【讨论】:

    • 啊,有道理。我想了一半,但不确定如何实现它。感谢您的帮助!
    【解决方案2】:

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

    例如

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

    您将避免处理数据库。

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

    【讨论】:

    • 是的,这只是我需要在事务发生时等待执行的一个示例,因此我将使用回调。获取/设置项目功能可能会派上用场,但非常感谢。
    【解决方案3】:

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

    var myfEspereti=false;
    
    function Espereti(pStatus)
    {
        if (pStatus==="wait")
        {
            myfEspereti = true;
            while(myfEspereti)
            {
    
            }
        }
        else if (pStatus==="go")
        {
            myfEspereti=false;
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多