2010-11-11 219 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); 
});