如何同步访问indexedDB?

时间:2012-02-09 22:39:36

标签: javascript indexeddb

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,如果它没有缓存在数据库中,或者这个,

data:image;base64,*BASE64DATA*

其中 BASE64DATA 是先前缓存的数据库中的数据。

我之前使用的是localStorage,它同步工作,但是有5MB的限制,所以我想我会尝试使用indexedDB。

4 个答案:

答案 0 :(得分:2)

有一个更普遍的问题,如何等待异步函数,你会找到答案: How to block on asynchronous functions in JavaScript

我还在Trial Tool内找到了一个很好的waitFor例程。

答案 1 :(得分:2)

IndexedDB Sync API被标记为IndexedDB specification的风险部分,由于可能缺乏实施,它们可能会被删除。

我使用'oncomplete'事务事件实现了'sync'解决方案,该事件保证当前操作在开始下一个操作之前完成,我还使用自定义semaphorequeue逻辑处理来自GUI的异步调用,并确保不会同时向IndexedDB数据库发送2个打开的连接。

答案 2 :(得分:2)

the accepted answer to this question I asked a couple months ago中提供了一种优雅的方法。不幸的是,它依赖于仅在Firefox中支持的JavaScript 1.7(生成器)的功能。希望有一天这种技术会得到更广泛的支持。

答案 3 :(得分:0)

IE10支持sync api,但indexeddb sync api只能在web worker中使用。如果您在UI线程中工作,则需要使用异步API。

使用异步API的最简单方法是通过promises。