2012-02-09 5 views
6

IndexedDB имеет spec, говорящий, что вы можете получить доступ к индексированной базе данных синхронно, но она еще не реализована.Как я могу синхронно обращаться к indexedDB?

мне было просто интересно, если есть способ сделать это синхронные вручную,

Мой JavaScript выглядит так,

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) 
    { 
    } 
} 

Так что вы можете положить что-то там, чтобы не ждать, пока OnSuccess метод был вызван до продолжения?

Причины, почему я хочу сделать это код выше обернут внутри этого метода,

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

Так это мозаичный слой ESRI (который будет загружать плитки на карту на моей веб-странице), и этот метод должен немедленно вернуть URL-адрес для определенной плитки. Это будет либо URL, чтобы загрузить изображение из, если не кэшируются в базе данных уже, или это,

data:image;base64,*BASE64DATA* 

Где BASE64DATA это данные из базы данных, если в кэше ранее.

Ранее я использовал локальную хранилище, которая работает синхронно, но имеет ограничение 5 МБ, поэтому я решил поэкспериментировать с indexedDB.

ответ

0

IE10 поддерживает sync api, но indexeddb sync api может использоваться только внутри веб-рабочего. Если вы работаете в потоке пользовательского интерфейса, вам необходимо использовать асинхронный API.

Самый простой способ работы с асинхронным API - это выполнить обещания.

+0

Пожалуйста, [не добавляйте подписи или метки в свои сообщения] (http://stackoverflow.com/faq#signatures). – meagar

2

IndexedDB Sync API отмечен как опасная часть IndexedDB specification, и они могут быть удалены из-за потенциального отсутствия реализаций.

Я реализовал решение «синхронизация» с помощью «OnComplete» события транзакции, что подтверждает, что текущее действие закончено перед началом следующего, и я также использовать пользовательские semaphore и queue логики, которая обрабатывает асинхронные вызовы от графического интерфейса пользователя и гарантирует, что 2 открытых подключения к базе данных IndexedDB не будут происходить одновременно.

+1

Является ли код для того, что вы описали в этом посте, в любом месте? – dumbmatter

2

Элегантный способ сделать это предоставляется в the accepted answer to this question I asked a couple months ago. К сожалению, он полагается на функцию JavaScript 1.7 (генераторы), которая поддерживается только в Firefox. Надеюсь, когда-нибудь эта техника будет более широко поддерживаться.

Смежные вопросы