2011-01-28 25 views
7

Tôi đang cố gắng tìm ra điều này nhưng không thể tự mình làm được ...
Tôi đang chơi với Web SQL DB và tôi không thể có vòng lặp hoạt động đúng cách với nó.
tôi sử dụng:Cơ sở dữ liệu SQL Web + Vòng lặp Javascript

for (var i=0; i<=numberofArticles-1; i++){ 
    db.transaction(function (tx) { 
    tx.executeSql('INSERT INTO LOGS (articleID) VALUES (?)', [i]); 
    }); 
}; 

Và tôi chỉ nhận được 5 của .. Tôi không nhận được i giá trị gia tăng.
Có ai có thể đề xuất những gì tôi đang làm sai và tôi nên suy nghĩ gì không?

Trả lời

6

Dường như chức năng là không đồng bộ, và vào thời điểm tx.executeSql cháy, vòng lặp đã kết thúc vòng lặp và i đã được thay đổi nhiều lần.

Bạn có thể giải quyết vấn đề này bằng cách đóng cửa.

for (var i=0; i<=numberofArticles-1; i++){ 
    function (value) { 
     db.transaction(function (tx) { 
     tx.executeSql('INSERT INTO LOGS (articleID) VALUES (?)', [value]); 
     }); 
    }(i); // <-- CALL the function 
}; 
+0

@David Dorward Bạn có thể giải thích một chút về sintax (javascript không phải là websql) không? Đặc biệt là dòng "} (i); // <- GỌI chức năng". Ý tôi là, tôi chỉ có thể sao chép mã, nhưng tôi muốn hoàn toàn hiểu nó. –

+4

Bạn gọi một hàm bằng cách gắn bó '(bất kỳ args)' nào vào cuối nó. 'function() {}()' giống như 'function foo() {}; foo(); 'ngoại trừ nó không giữ' foo' xung quanh để sử dụng sau này. – Quentin

+0

@ Dorav Dorward Tôi hiểu, cảm ơn. –

11

Do nó là cách khác xung quanh:

<script> 
    numberofArticles = 5; 
    db = openDatabase("websql", "0.1", "web-sql testing", 10000); 
    db.transaction(function(tx) { 
     tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, articleID int)'); 
    }); 
    db.transaction(function (tx) { 
     for (var i=0; i<=numberofArticles-1; i++){ 
      tx.executeSql('INSERT INTO LOGS (articleID) VALUES (?)', [i]); 
     }; 
    }); 
</script> 

Và thay thế, cách thích hợp với các vòng lặp bên ngoài đó là không cần thiết trong trường hợp này

for (var i=0; i<=numberofArticles-1; i++){ 
     (function(i) { 
     db.transaction(function (tx) { 
       tx.executeSql('INSERT INTO LOGS (articleID) VALUES (?)', [i]); 
     }); 
     })(i); 
    }; 
Các vấn đề liên quan