2010-10-29 52 views
7

tôi hiện đang sử dụng cơ sở dữ liệu phía máy khách trên webapp web html5. Trong mã của tôi tôi cần phải kiểm tra xem một hàng có mặt trong DB địa phương:API cơ sở dữ liệu HTML5: Yêu cầu đồng bộ

function isStarted(oDB) { 
var ret = null; 
oDB.query(sql,params,function(transaction,result) { 
    if(result.rows.length > 0) { 
     ret = true; 
    } else { 
     ret = false; 
    } 
}); 

return ret; 

}

Đáng tiếc là sự trở lại của isStarted() xảy ra trước khi chức năng gọi lại và tôi luôn có được một "null" giá trị. Trong W3c spec chúng ta có thể thấy "cơ sở dữ liệu đồng bộ-api" nhưng làm cách nào tôi có thể sử dụng? Có một mẹo để có được giá trị "ret" tốt với các yêu cầu không đồng bộ không?

Nhờ sự giúp đỡ của bạn

+0

Tôi thích câu hỏi này. Nó nói rõ vấn đề. –

Trả lời

8

Để có được một đối tượng thực hiện DatabaseSync bạn phải gọi openDatabaseSync(...) thay vì openDatabase(...). Tôi không biết về iPhone, hoặc những gì các đối tượng oDB bạn có, nhưng theo spec bạn chỉ nhận được phương pháp openDatabaseSync trong một WebWorker và không phải trong trình duyệt web bình thường window. Chắc chắn XMLHttpRequest đã chứng minh rằng các hoạt động đồng bộ có khả năng có chiều dài trong chuỗi giao diện người dùng không phải là một ý tưởng hay.

Không thể chạy đồng bộ mã không đồng bộ hoặc ngược lại. Để làm như vậy, bạn cần có các tính năng cấp ngôn ngữ như chủ đề hoặc các chương trình mà JavaScript không có. Bạn phải thoát khỏi các hàm của mình và trả về điều khiển cho trình duyệt để cho phép nó thực hiện yêu cầu HTTP hoặc truy vấn cơ sở dữ liệu và gọi lại cho bạn về hàm xử lý mà bạn đã cung cấp.

Vì vậy, bạn sẽ phải viết lại mã 'từ trong ra ngoài' để chuyển các hàm gọi lại thay vì mong đợi các giá trị trả về, mỗi khi bạn làm điều gì đó liên quan đến cơ sở dữ liệu IO.

function tellMeWhenIsStarted(oDB, callback) { 
    oDB.query(sql,params,function(transaction,result) { 
     callback(result.rows.length>0); 
    } 
}); 
+0

Bạn có đang gọi lại hoặc gọi lại không? –

+0

Bạn đang gọi nó. –

8

Tôi là người duy nhất tìm thấy yêu cầu không đồng bộ này một cách vô lý? Hơn nữa, có vẻ như Safari chỉ thực hiện mô hình không đồng bộ ngay bây giờ ... Tôi tự hỏi làm thế nào chúng tôi có hiệu quả mã như vậy ...

Tôi thích bất kỳ liên kết nào đến chương trình nghiêm túc với trình điều khiển db không đồng bộ.

-1

Bạn phải chặn thực thi tiếp theo khi bạn dự định truy xuất kết quả một cách đồng bộ, Giá bạn phải trả là giao diện người dùng bị chặn trong khi thực hiện.

var ret = null; 
var finished = false; 

cfunction isStarted(oDB) { 
     oDB.query(sql,params,function(transaction,result) { 
       ret = result; 
       finished = true; 
     }); 

    while(!finished){ 
    ;//block next execution, while result is being fetched 
    } 
    return ret; 
} 
+1

Điều này có vẻ không hoạt động, ít nhất là trong Chromium 17.0.963.56. Nó cũng là những gì tôi mong đợi, vì JS không thực sự có Threads, do đó, không chỉ UI bị chặn trong vòng lặp while, mà cả việc tìm nạp thực tế nữa. – keppla

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