2015-08-19 73 views
0

我目前正在嘗試從一個數組插入數據到WebSQL數據庫,並得到一些奇怪的結果。我認爲這是因爲它是異步的。WebSQL事務內循環在JS

問題是我試圖插入數據使用事務內循環嵌套另一個事務。代碼幾乎可用,但只能完成循環的最終事務。

    for (i = 0; i < array.gArr.length; i++) 
        { 
         var group_id = array.gArr[i].group_id; 
         var title = array.gArr[i].title; 
         var description = array.gArr[i].description; 
         var photo = array.gArr[i].default_photo; 


         tx_num = "tx" + i; 


         db.transaction(function (tx_num) {  
          tx_num.executeSql("INSERT OR IGNORE INTO my_groups(group_id, title, description, photo_url) VALUES (?,?,?,?)", [group_id, title, description, photo]); 
         }); 


        } 

tx_num存在的原因是試圖查看它是否由於具有相同的tx名稱。

我也嘗試使用只是INSERT INTO incase這是造成問題,結果是一樣的。

db.transaction(function (tx) { 

    tx.executeSql('CREATE TABLE IF NOT EXISTS my_groups(group_id UNIQUE, title, description, photo_url)'); 

}); 

任何幫助,將不勝感激:

僅供參考表已經使用創建。

回答

1

我找到了解決方案。

似乎每次循環完成時都會覆蓋事務,因此它只完成最終事務。爲了確保所有這些都運行,你需要把這個循環放入db.transaction中。通過這樣做,所有事務都在db.transaction運行時運行。這全部歸因於異步性質。

這裏是供將來參考的代碼:

db.transaction(function (tx1) {  
    for (i = 0; i < array.gArr.length; i++) 
    { 
     var group_id = array.gArr[i].group_id; 
     var title = array.gArr[i].title; 
     var description = array.gArr[i].description; 
     var photo = array.gArr[i].default_photo; 

     tx1.executeSql("INSERT OR REPLACE INTO my_groups(group_id, title, description, photo_url) VALUES (?,?,?,?)", [group_id, title, description, photo]); 

    } 

});