【问题标题】:Why does indexedDB objectStore.get call onsuccess even when the objectStore does not contain the object?为什么 indexedDB objectStore.get 即使在 objectStore 不包含对象的情况下也会调用 onsuccess?
【发布时间】:2013-01-21 20:52:53
【问题描述】:

关于 indexedDB 的一个奇怪之处在于,带有不在 objectstore 中的键的 objectStore.get() 请求会生成带有 (event.target.results == undefined) 的成功事件(请参阅:http://www.w3.org/TR/IndexedDB/#object-store get 函数)。

我需要捕获这种类型的“成功”并记录下来。现在,我在返回的事件中找不到 KEY。所以我正在做一个真正的黑客并将其存储在事务中。有什么建议吗?

   var deferred = new jQuery.Deferred(); // this is what gets returned
    var id = view.zoom + "-" + view.tile.column + "-" + view.tile.row;
    trans = DB.transaction(["Images"], "readonly");
    store = trans.objectStore("Images");
    req = store.get(id);
    trans._keyPathForGet = id; // hack
    req.onsuccess = function (e) {
        var blob = e.target.result;
        if (blob == undefined) {
            console.log("no blob of id: " + e.target.transaction._keyPathForGet);
            deferred.resolve(null);
        } else {
            var imgURL = URL.createObjectURL(blob);
            deferred.resolve(imgURL); // let leaflet know we're done, and give it the URL
            URL.revokeObjectURL(imgURL); // not sure if we're revoking it too soon here
        }

【问题讨论】:

    标签: indexeddb


    【解决方案1】:

    这是用于组合键和键范围的过度紧凑 API 设计的产物。即使没有删除任何内容,您也可以找到删除 ramdon 键也会获得成功事件。我对键范围查询返回成功很好,但键查询应该返回错误事件。

    无论如何,这类问题有很好的替代解决方案。最好的方法是使用光标。存储密钥是没有问题的,你可以保持在一个函数闭包下。

    var getFile = function (id) {
      ...
      var req = store.openCursor(id);
      req.onsuccess = function(e) {
        var cursor = e.target.result;
        if (cursor) {
           var blob = cursor.value; 
           ...
        } else {
           var err = new Error();
           err.name = 'NotFoundError';
           err.id = id;
           deferred.reject(err);        
        }
      }
      return deferred;
    }
    

    您也可以使用count 方法来查询键是否在对象存储中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多