1

indexedDB の奇妙な点の 1 つは、objectstore にないキーを持つ objectStore.get() リクエストが成功イベントを生成すること(event.target.results == undefined)です (参照: http://www.w3.org/TR/IndexedDB/#object- 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
        }
4

1 に答える 1

4

これは、キーとキー範囲を組み合わせるための過度にコンパクトな 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メソッドを使用して、キーがオブジェクト ストアにあるかどうかをクエリすることもできます。

于 2013-01-22T02:47:32.460 に答える