2015-04-28 92 views
2

我正在嘗試使用openCursor()方法遍歷我的「product」objectStore中的所有對象。indexedDB - objectStore.openCursor()不會返回objectStore中的所有對象

function getAllProducts(){ 
    var products = []; 
    var transaction = db.transaction(["product"], "readonly"); 
    var objectStore = transaction.objectStore("product"); 

    objectStore.openCursor().onsuccess = function(event) { 
     var cursor = event.target.result; 
     if(cursor) { 
     products.push(cursor.value); 
     cursor.continue(); 
     } 
    }; 
} 

我的「產品」objectStore包含五(5)個對象。所以我期待我的產品陣列長度也是5。但是,通過日誌檢查時,似乎迭代的對象數量不是恆定的。有時它只返回一(1)條記錄,還有時間它只返回兩(2)條記錄。

我的代碼有什麼問題?有什麼我失蹤?

我嘗試添加onsuccess,onerror & onabort句柄,但控制檯中仍然沒有其他日誌。下面是我的更新代碼:

function getAllProducts(){ 
    var products = []; 
    var transaction = db.transaction(["product"], "readonly"); 
    var objectStore = transaction.objectStore("product"); 

    objectStore.openCursor().onsuccess = function(event) { 
     var cursor = event.target.result; 
     if(cursor) { 
     products.push(cursor.value.name); 
     cursor.continue(); 
     } 
     console.log(products); 
    }; 

    transaction.oncomplete = function(event) { 
     console.log(event); 
    }; 

    transaction.onerror = function(event) { 
     console.error(event); 
    }; 

    transaction.onabort = function(event) { 
     console.log("YO YO YO"); 
     console.error("transaction aborted"); 
    }; 

} 

回答

0

的IDBTransaction對象具有的onComplete和onError的處理當交易完成時調用。嘗試使用某些控制檯消息添加這些處理程序,以查看是否引發任何問題。例如:

transaction.oncomplete = function(event) { 
    console.log(event); 
    }; 


transaction.onerror = function(event) { 
    console.error(event); 
}; 

另外,對象存儲如何填充?在所有5個對象被插入之前,getAllProducts()函數會被調用嗎?

+0

嘗試添加上述處理程序,並沒有記錄的消息。這是否意味着交易也沒有完成,因爲它沒有記錄任何東西? – user3931577

+0

因此transaction.oncomplete消息未被記錄?這意味着交易掛在某處而不是完成。你使用的是什麼瀏覽器? –

+0

是的,這可能是那個原因,但我怎麼知道爲什麼交易沒有完成?順便說一句,我正在使用鉻。 – user3931577

1

請不要在全局範圍中使用數據庫變量。

+0

這是InexedDB入門者中的一個非常常見的錯誤 –

+2

這很好,但我們可以解釋爲什麼?在因特網上有很多使用全局數據庫var的例子。 –

+0

解釋是,如果您非常適合編寫異步代碼,則只應使用全局數據庫變量。如果你有疑問,那就避免使用一個。互聯網上的例子的作者並不完美。 – Josh

0

在你的對象庫中查找錯誤,以防萬一,我在下面添加。您只能在交易觸發oncomplete處理程序時知道沒有更多產品;我將你的console.log移動到該事件處理程序。如果你仍然看到不完整的結果,它肯定是別的。

function getAllProducts(){ 
    var products = []; 
    var request; 
    var transaction = db.transaction(["product"], "readonly"); 
    var objectStore = transaction.objectStore("product"); 

    transaction.oncomplete = function(event) { 
     console.log(products); 
     console.log(event); 
    }; 

    transaction.onerror = function(event) { 
     console.error(event); 
    }; 

    transaction.onabort = function(event) { 
     console.log("YO YO YO"); 
     console.error("transaction aborted"); 
    }; 

    request = objectStore.openCursor(); 

    request.onsuccess = function(event) { 
     var cursor = event.target.result; 
     if(cursor) { 
     products.push(cursor.value.name); 
     cursor.continue(); 
     } 
    }; 

    request.onerror = function(event) { 
     console.error(event.error); 
    }; 

} 
1

這可能是因爲您正試圖在光標完成循環/處理之前進行讀取。我會建議使用回調方法,該方法將在最終結果集的遊標處理結束時調用。 喜歡的東西(投擲代碼給你一個想法):

function get_object(object, callBack){ 
     var obj_list = []; 
     var transaction = db.transaction([object],"readonly"); 
     var obj_store = transaction.objectStore(object); 

     obj_store.openCursor().onsuccess = function (event){ 
      cursor = event.target.result; 
      if(cursor){ 
       console.log(cursor.value); 
       obj_list.push(cursor.value); 
       cursor.continue(); 
      }else{ 
       console.log("Done processing " + object + "..."); 
       if (callBack&& typeof(callBack) == 'function') { 
        callBack(obj_list); 
       } 
       return; 
      } 
     }; 
    } 

,然後用它作爲:

get_object("data_store", callBack); 
function get_object_result_processor(resultSet){ 
    //Do something 
} 
相關問題