2012-09-25 103 views
1

這是用Javascript編寫的for循環。它試圖爲websql應用查詢。只有Javascript中for循環的最後一次運行才能運行

for (var i = 0; i < 10; i++){ 
    db.transaction(function (tx){ 
    tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]); 
    }); 
} 

的嘗試是顯而易見的,我試圖在表ProjSetsT添加值 「0,1,2,... 9」 到列PROJID。這是行不通的。我只得到最後一個元素,即插入了「9」,但不是前八個數字。

是否有語法錯誤?

+2

語法錯誤會阻止它直接運行:給出的異步背景下,i將有你在循環內創建的第一個函數被調用

可以使用封閉修復它之前達到其最大尺寸。 WebSQL是一個異步API,你不能指望它以這種方式捕捉正確的值。參見[Web SQL數據庫+ Javascript循環](http://stackoverflow.com/questions/4825455/web-sql-database-javascript-loop)。另外,在一個事務中運行多個查詢的速度更快,並且實際上保證了插入順序。在單獨的事務中運行每個事務是一個隨機排序的慢速免費。 – DCoder

+1

爲什麼不做一個查詢?綁定的值是從for循環中的值構建的字符串。 –

回答

4

我認爲db.transaction可能會異步運行,因此可能會爲您搞砸。你是否試圖在事務內移動for循環?

db.transaction(function (tx){ 
    for (var i = 0; i < 10; i++){ 
     tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]); 
    } 
}); 
+0

你說得對。我認爲這是通過其他人的建議都可以工作的最直接的方法。這就是爲什麼我把你的答案。 –

1

你有幾個功能,引用相同i變量,10該結束了。

您需要爲每個函數創建一個新的可變範圍。

for (var i = 0; i < 10; i++){ 
    db.transaction(makeHandler(i)); 
} 

function makeHandler(j) { 
    return function (tx){ 
     tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [j]); 
    }; 
} 

i立即被傳遞給makeHandler,它接收它作爲j

每次調用makeHandler時,都會返回一個函數,該函數引用自己的本地j變量。

2

您作爲參數傳遞的每個函數都與i共享相同的引用,因此每個新函數對象的i值都會遞增。

for (var i = 0; i < 10; i++) 
{ 
    db.transaction((function(privateI) 
    {//privateI is unique for every function object 
     return function (tx) 
     { 
      tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [privateI]); 
     }; 
    })(i));//pass current value here 
}