2013-02-10 23 views
6

xem xét:Làm thế nào để thực hiện một truy vấn WebSQL đồng bộ?

var globalvar; 

function viewyearmain() { 
    db.transaction(function (tx) 
    { 
    tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results) 
    { 
     var len = results.rows.length; 
     msg = len; 
     globalvar = msg; 
    }, null); 

    }); 

    if (globalvar>0) 
    { 
    alert("ROWS FOUND"); 
    } 
    else 
    { 
    alert("ROWS NOT FOUND"); 
    } 
} 

Vấn đề là ROWS NOT FOUND xuất hiện vì các giao dịch chưa hoàn thành vào thời điểm báo cáo if là đạt.

Trả lời

5

Gọi lại không đồng bộ không đồng bộ, bất kể bạn muốn bao nhiêu.

Chỉ cần di chuyển tất cả mã phụ thuộc vào kết quả vào callback:

var globalvar; 

function viewyearmain() { 
    db.transaction(function (tx) 
    { 
    tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results) 
    { 
     var len = results.rows.length; 
     msg = len; 
     globalvar = msg; 
     if (globalvar>0) 
     { 
     alert("ROWS FOUND"); 
     } 
     else 
     { 
     alert("ROWS NOT FOUND"); 
     } 
    }, null); 

    }); 
} 

Ngoài ra, di chuyển nó vào một chức năng thứ hai, và gọi đó là từ gọi lại.

+0

@Michael Để đặt câu hỏi, hãy sử dụng nút "Đặt câu hỏi". –

0

Theo hiểu biết của tôi, WebSQL không hỗ trợ các câu lệnh SQL đồng bộ. Điều này thường là một điều tốt, vì bạn không muốn việc xử lý SQL làm gián đoạn hoặc đóng băng Giao diện người dùng của bạn. Như vậy, câu trả lời của CL. cung cấp cơ chế không đồng bộ phù hợp để xử lý các kết quả cho một truy vấn.

Nếu, tuy nhiên, bạn thực sự mong muốn các truy vấn SQL đồng bộ, sau đó kiểm tra tùy chọn WebSQL: SequelSphere - An HTML5/JavaScript SQL Relational Database.

Đây là JavaScript 100%, vì vậy nó chạy trong bất kỳ trình duyệt nào và trên bất kỳ nền tảng nào. Thêm vào đó, nó lưu trữ dữ liệu của nó trong IndexedDB hoặc LocalStorage. Nó cũng chứa nhiều chuông và còi mà WebSQL không: Tích hợp JSON, Trình theo dõi thay đổi, Các hàm SQL do người dùng định nghĩa, xử lý SQL SYNCHRONOUS, vv Vì tiêu chuẩn WebSQL không được chấp nhận, tôi nghĩ đây là một sự thay thế tuyệt vời.

Tiết lộ đầy đủ: Tôi yêu WebSQL, nhưng đã kết hôn với SequelSphere.

+0

Cảm ơn bạn đã cung cấp thông tin ... Tôi đã sửa mã của mình theo ý tưởng của CL và hoạt động của nó .. nhưng tôi cũng sẽ xem xét bài đăng .. Cảm ơn bạn @ John Fowler .. – user2058890

+0

@John Fowler Tôi muốn biết về SequelSphere hỗ trợ ngoại tuyến hay không? –

+0

@Kanna SequelSphere hỗ trợ ngoại tuyến (sử dụng tệp kê khai bộ nhớ cache của ứng dụng). Nó lưu trữ dữ liệu của nó trong IndexedDB hoặc LocalStorage (theo thứ tự đó, dựa trên những gì trình duyệt hỗ trợ). –

0

Đã muộn một chút nhưng đối với những gì đáng giá ... bạn không thể thực hiện cuộc gọi đồng bộ nhưng bạn có thể đơn giản hóa mã của mình bằng cách sử dụng thư viện như Async. Nó có vẻ như quá mức cần thiết nhưng nếu bạn cần thực hiện 3 hoặc 4 câu lệnh liên tiếp, nó có thể làm cho mã của bạn dễ đọc hơn rất nhiều.

async.waterfall([ 
    function(callback){ 
     db.transaction(function (tx) { 
      tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], 
       function (tx, results) { 
        var len = results.rows.length; 
        callback(null, len) 
       }, 
       function(){ 
        callback("An error occurred when reading data"); 
       } 
      }); 
     }); 
    }, 
    function(len, callback){ 
     // Now do something with the length. 
     console.log("The length is: " + len); 
    } 
]); 
0

Tôi trễ vài năm, nhưng xem xét câu hỏi chưa bao giờ được trả lời trực tiếp, tôi nghĩ tôi sẽ ném hai xu vào, cũng như thêm một số gợi ý!

Trước tiên, nếu bạn đang đọc, có thể bạn không nên sử dụng WebSQL. Nó đã được deprecated ủng hộ IndexedDB, mà tại thời điểm này là cơ sở dữ liệu duy nhất theo dõi tiêu chuẩn W3C.

Nếu vì lý do gì đó, bạn có ý định sử dụng WebSQL và bạn có thể sống mà không có những lợi ích mà API không đồng bộ của nó cung cấp (một số được đề cập trong câu trả lời của John Fowler), thì bạn nên biết xác định một synchronous API.

Vì vậy, có, có một cách để thực hiện các câu lệnh trong WebSQL đồng bộ, miễn là các trình duyệt bạn đang phát triển đã triển khai API đồng bộ.

Nếu bạn không ngại xử lý giao diện không đồng bộ chỉ đơn giản là giao diện đồng bộ, hãy kiểm tra BakedGoods.

Với nó, thực hiện truy vấn của bạn cũng đơn giản như:

bakedGoods.getAll({ 
    filter: "valueObj.holdingType === 'month'", 
    storageTypes: ["webSQL"], 

    //Contains database configuration data and operation preferences 
    options: optionsObj, 

    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){} 
}); 

giao diện đơn giản của nó và hỗ trợ cơ sở lưu trữ chưa từng có đi kèm với chi phí thiếu sự hỗ trợ đối với một số lưu trữ các cấu hình thiết bị cụ thể. Ví dụ, nó không hỗ trợ việc dẫn các hoạt động lưu trữ trong các bảng WebSQL với các khóa chính nhiều cột.

Vì vậy, nếu bạn sử dụng nhiều loại tính năng đó, bạn có thể muốn tìm ở nơi khác.

Ồ, và vì lợi ích của sự minh bạch hoàn toàn, BakedGoods được duy trì bởi bạn thực sự :).

Các vấn đề liên quan