2012-02-09 24 views
6

Chỉ mụcDB có spec nói rằng bạn có thể truy cập cơ sở dữ liệu được lập chỉ mục đồng bộ, nhưng chưa được triển khai.Tôi làm cách nào để truy cập đồng bộ chỉ mụcDB?

Tôi chỉ tự hỏi nếu có một cách để làm cho nó đồng bộ bằng tay,

trông JavaScript của tôi như thế này,

var trans = databaseAsync.transaction(["mapTile"], IDBTransaction.READ_WRITE); 
var store = trans.objectStore("mapTile"); 
var keyRange = IDBKeyRange.bound(evt.data[0], evt.data[0]); 
var cursorRequest = store.openCursor(keyRange); 

// can you put some kind of wait in here? 

cursorRequest.onsuccess = function(e) 
{ 
    var result = e.target.result; 
    if(!!result == false) 
    { 
    } 
} 

Vì vậy, bạn có thể đặt một cái gì đó ở đó để làm cho nó đợi cho đến khi onSuccess phương pháp đã được gọi trước khi tiếp tục?

Lý do tại sao tôi muốn làm điều này là mã trên được gói bên trong phương pháp này,

dojo.extend(esri.layers.ArcGISTiledMapServiceLayer, { 
     getTileUrl : function(level, row, col) 
     { 
      // blah 
      return url; 
     } 

Vì vậy, nó là một lớp ngói ESRI (mà sẽ được tải gạch lên một bản đồ trên trang web của tôi), và phương thức đó cần trả lại url ngay lập tức cho một ô cụ thể. Nó hoặc sẽ là một URL để tải hình ảnh từ nếu nó không được lưu trữ trong cơ sở dữ liệu đã có, hoặc này,

data:image;base64,*BASE64DATA* 

đâu BASE64DATA là các dữ liệu từ cơ sở dữ liệu nếu lưu trữ trước đó.

Trước đây tôi đã sử dụng localStorage cho mục này, hoạt động đồng bộ, nhưng có giới hạn 5MB nên tôi nghĩ tôi sẽ thử nghiệm với indexedDB.

Trả lời

0

IE10 hỗ trợ api đồng bộ hóa, nhưng api đồng bộ hóa chỉ mụcbáo chỉ có thể được sử dụng bên trong một nhân viên web. Nếu bạn đang làm việc trong chuỗi giao diện người dùng, bạn cần phải sử dụng API async.

Cách dễ nhất để làm việc với API không đồng bộ là thông qua lời hứa.

+0

Vui lòng [không thêm chữ ký hoặc dòng giới thiệu vào bài đăng của bạn] (http://stackoverflow.com/faq#signatures). – meagar

2

API được đồng bộ hóa được lập chỉ mụcDB được đánh dấu là một phần nguy hiểm của IndexedDB specification và chúng có thể bị xóa do thiếu triển khai tiềm năng.

Tôi đã triển khai giải pháp 'đồng bộ hóa' sử dụng sự kiện giao dịch 'không đầy đủ' đảm bảo rằng hành động hiện tại đã kết thúc trước khi bắt đầu hành động tiếp theo và tôi cũng sử dụng logic semaphorequeue tùy chỉnh xử lý cuộc gọi không đồng bộ từ GUI và đảm bảo rằng 2 kết nối mở đối với cơ sở dữ liệu IndexedDB sẽ không xảy ra cùng một lúc.

+1

Mã cho những gì bạn mô tả trong bài đăng này có sẵn ở bất kỳ đâu không? – dumbmatter

2

Cách thanh lịch để thực hiện việc này được cung cấp trong the accepted answer to this question I asked a couple months ago. Thật không may, nó dựa trên tính năng của JavaScript 1.7 (máy phát) chỉ được hỗ trợ trong Firefox. Hy vọng rằng một ngày nào đó kỹ thuật này sẽ được hỗ trợ rộng rãi hơn.

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