2010-11-11 168 views
1

首先我知道WebKit不允许向SQLite数据库发出同步请求。我开始玩它,并试图将结果分配给全局变量“数据”。我仍然不确定是否有可能,但想问你。Javascript全局变量问题

  1. 我创建的全局对象来存储来自DB

    var data = {};
  2. 这里回应是DB类


var db = { 
     mydb: false, 
     init: function() { 
      try { 
       if (!window.openDatabase) { 
        alert('not supported'); 
       } else { 
        this.mydb = openDatabase('test_db', '1.0', 'Test DB', 1024*1024*5); 
       } 
      } catch(e) { 
       // Error handling code goes here. 
       if (e == INVALID_STATE_ERR) { 
        // Version number mismatch. 
        alert('Invalid database version.'); 
       } else { 
        alert('Unknown error '+e+'.'); 
       } 
       return; 
      } 
     }, 
     exec: function (query, params) { 
      try { 
       this.mydb.transaction(function(transaction) { 
        transaction.executeSql(query, params, db.dataHandler, db.errorHandler); 
       }); 
      } catch(e) { 
       alert(e.message); 
      } 
     }, 
     dataHandler: function (transaction, results) { 
      // Handle the results 
      data = results.rows; 
      return true;  
     }, 
     errorHandler: function (transaction, error) { 
      // returns true to rollback the transaction 
      alert('Code: '+error.code+'\nMessage: '+error.message); 
      return true; 
     }, 
    } 
  1. 最后这里的问题是:

$(function() { 
    db.init(); 
    db.exec('SELECT * FROM errors;'); 
    alert(Log.object_toString(data)); // this alert show empty object as I declared in first line 
    alert(Log.object_toString(data)); // this one return object with responded data from database 
}); 

所以,问题是,我不能db.exec()调用之后对“数据”操纵,但如果我的交易后,使警报(),则数据将与所有信息填充。

任何想法如何避免它?

回答

3

我会假设你正在进行异步 AJAX调用,所以你的alert()在收到响应之前触发。

编辑:作为@Nick指出,这不是AJAX,但它是异步的,是一个问题。

我不知道你正在使用的API任何东西,但它看起来好像你的提醒应该是dataHandler方法中:

dataHandler: function (transaction, results) { 
    // Handle the results 
    data = results.rows; 
    alert(Log.object_toString(data)); 
    alert(Log.object_toString(data)); 
    return true;  
}, 

还是应该在一些其他的功能,那就是从内部呼叫dataHandler

dataHandler: function (transaction, results) { 
    // Handle the results 
    data = results.rows; 
    someFunction(data); 
    return true;  
}, 

// ... 

function someFunction(data) { 
    alert(Log.object_toString(data)); 
    alert(Log.object_toString(data)); 
} 

原因之间的alert()使得它的工作,是暂停给予回应机会回到另一个警报运行之前。

+1

这是HTML5,没有涉及AJAX,但它是异步的:) – 2010-11-11 20:28:41

+0

谢谢@尼克。在黑暗中是一枪。我真的必须加快HTML5的速度。 :o) – user113716 2010-11-11 20:30:11

+0

看起来他正在使用本地数据库。这并不重要,它仍然是异步的。我认为'exec'应该接受一个回调函数参数,它传递给它的从属函数。 *编辑:* Nick击败了我:p – 2010-11-11 20:30:54

1

问题是,如果您在调用exec之后立即访问数据,dataHandler回调函数尚未调用。确保您实际从查询中收到数据的唯一方法是在回调本身内处理它。对于您可以重新设计你的班级有点让exec函数实际上也采取了回调函数,将作为查询已成功执行被立即调用,如

exec: function (query, params, onSuccess /*, onFailure*/) { 
    try { 
     var onFailure = arguments[3] || function(){}; 
     this.mydb.transaction(function(transaction) { 
      transaction.executeSql(query, params, onSuccess, onFailure); 
     }); 
    } catch(e) { 
     onFailure(e); 
    } 
} 

然后,你可以打电话给你的db.exec像这样:

db.exec('SELECT * FROM erros;', null, function(rows) { 
    alert(Log.object_toString(rows)); 
}, function() { 
    var error = arguments[0] || {message: 'Unknown Exception'}; 
    alert('An error occured: ' + error.message); 
});