【问题标题】:How can I access indexedDB synchronously?如何同步访问 indexedDB?
【发布时间】:2012-03-02 11:07:49
【问题描述】:

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 是数据库中的数据(如果之前已缓存)。

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

【问题讨论】:

  • 6 年 4 个月后...这个问题仍然有价值,正在寻找一个像样的更新答案!

标签: javascript indexeddb


【解决方案1】:

IndexedDB Sync API 被标记为IndexedDB specification 的一个有风险的部分,它们可能由于可能缺乏实现而被删除。

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

【讨论】:

  • 你在这篇文章中描述的代码在任何地方都可用吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    我还在 Trial Tool 中找到了一个不错的 waitFor 例程。

    【讨论】:

      【解决方案4】:

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

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

      猜你喜欢
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2016-03-31
      • 1970-01-01
      • 2016-10-21
      相关资源
      最近更新 更多