【问题标题】:Phonegap / Web SQL: Why does an IF after the tx.transaction fire before the tx.transactionPhonegap / Web SQL:为什么 tx.transaction 之后的 IF 在 tx.transaction 之前触发
【发布时间】:2014-07-16 20:21:12
【问题描述】:

My Phonegap 应用程序检查设备上数据库中的代码 (WebSQL)。如果找到数据库和记录,则打开页面,否则调用 addActivationCode() 函数,该函数显示表单以要求输入代码。

困扰我的部分是当数据库存在并且记录存在时,为什么底部的 IF 在 tx.executeSQL 之前被调用?

我已经在 Chrome 中使用警报对此进行了测试,并且在 onDeviceReady 函数完成之前肯定会调用 IF。

找到数据库后,var len 被设置为一个计数。但是,首先测试 IF,因此 len==0 并显示表单,然后 tx.executeSql 运行并在表单上显示页面。

是否有可能以某种方式阻止这种行为?

(这是代码的网络浏览器版本。我使用的是 JQuery):

$(document).on('pageinit','#home',function(){

  $("#activation_form").hide();

  checkDB(); 

  function checkDB() {

    db = window.openDatabase('TEST','1.0','test',2*1024);

    var len = 0;
    var act_code = "";

    db.transaction( function (tx){

        tx.executeSql('SELECT * FROM TEST',[],function(tx,results){

            var i;

            len = results.rows.length;

            for (i = 0; i < len; i++){
              act_code = results.rows.item(i).actcode;
            }

           build_page(act_code);

        }, null);


    if (len === 0){ 
        addActivationCode();
    }
  });
  }
});

为什么在 tx.executeSQL 运行之前调用这个 IF? var len 未设置,即使数据库存在。几秒钟后 tx.executeSql 运行,var len 被设置为一个值并调用 build_page。

提前致谢。

【问题讨论】:

    标签: jquery-mobile cordova


    【解决方案1】:

    db.transaction() 调用是异步调用,这意味着函数调用将立即返回,函数作为在异步模式下运行的参数传递。
    它将不等待作为参数传递的函数完成执行。
    因此,您的 IF 语句在 tx.() 调用 完成 执行之前 执行。
    tx.() 调用的解释相同。 tx 调用是一个异步函数。
    您需要在function(tx,results){...}

    中添加 IF 语句
    tx.executeSql('SELECT * FROM TEST',[],function(tx,results){
            var i;
    
            len = results.rows.length;
    
            if (len === 0){ 
                 addActivationCode();
            } else {
    
               for (i = 0; i < len; i++){
                   act_code = results.rows.item(i).actcode;
               }
    
               build_page(act_code);
            }
    
        }, null);
    

    【讨论】:

    • 谢谢。但是,据我所见(在这种情况下并没有那么远)如果我将 IF 放在 tx.executeSql 中,如果数据库不存在,它将永远不会被调用。
    【解决方案2】:

    最后我重新组织了代码,这在 Chrome 中完美运行:

    function onDeviceReady() {
    
        db = window.openDatabase('TEST','1.0','TEST',2*1024);
    
        var len = 0;
        var act_code = "";
    
        db.transaction(findCode, onError1, addCode);
    
        function findCode(tx){
    
            tx.executeSql('SELECT * FROM TEST',[],loadPage,onError2);
    
        }
    
        function loadPage(tx,results){
    
            len = results.rows.length;
    
            for (i = 0; i < len; i++){
              act_code = results.rows.item(i).actcode;
            }
    
            build_page(act_code);
    
        }
    
        function addCode(){
    
            if(len==0){                
                addActivationCode();                   
            }
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多