12

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是以前缓存的数据库中的数据。

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

4

4 回答 4

3

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

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

于 2012-08-29T13:31:13.553 回答
3

我在几个月前提出的这个问题的公认答案中提供了一种优雅的方法。不幸的是,它依赖于仅在 Firefox 中支持的 JavaScript 1.7(生成器)功能。希望有一天这种技术会得到更广泛的支持。

于 2012-08-29T14:44:50.043 回答
2

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

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

于 2012-02-26T10:25:48.297 回答
0

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

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

于 2012-08-13T06:12:53.023 回答