2013-01-21 24 views
0

有關indexedDB的奇怪之處之一是,使用不在對象庫中的鍵的objectStore.get()請求將生成(event.target.results == undefined)(請參閱:http://www.w3.org/TR/IndexedDB/#object-store get函數)的成功事件。爲什麼即使objectStore不包含對象,indexedDB objectStore.get也會調用onsuccess?

我需要陷阱這種類型的「成功」並記錄下來。現在,我在返回的事件中找不到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 
     } 

回答

3

這是結合了密鑰和密鑰範圍的超緊湊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方法查詢的關鍵是在對象存儲或不是。

相關問題