Как я могу получить доступ к indexedDB синхронно? - PullRequest
9 голосов
/ 10 февраля 2012

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

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

Мой 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 - это данные из базы данных, если ранееcached.

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

Ответы [ 4 ]

2 голосов
/ 29 августа 2012

Элегантный способ сделать это представлен в принятом ответе на этот вопрос, который я задал пару месяцев назад . К сожалению, он опирается на особенность JavaScript 1.7 (генераторы), которая поддерживается только в Firefox. Надеюсь, когда-нибудь эта техника будет более широко поддержана.

2 голосов
/ 29 августа 2012

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

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

2 голосов
/ 26 февраля 2012

Есть более общий вопрос, как ждать асинхронных функций, где вы найдете ответ: Как заблокировать асинхронные функции в JavaScript

Я также нашел приятное ожидание для процедуры внутри Trial Tool .

0 голосов
/ 13 августа 2012

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

Самый простой способ работы с асинхронным API - через обещания.

...