indexedDB - objectStore.openCursor()不返回objectStore中的所有对象

时间:2015-04-28 08:35:48

标签: indexeddb cursors

我正在尝试使用openCursor()方法迭代我的“product”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();
      } 
    };
}

我的“product”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");
     }; 

}

4 个答案:

答案 0 :(得分:1)

尽量不要使用全局范围内的db变量。

答案 1 :(得分: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
}

答案 2 :(得分:0)

IDBTransaction对象有一个oncomplete和onerror句柄,在事务完成时会被调用。尝试使用一些控制台消息添加这些处理程序,以查看是否出现任何问题。类似的东西:

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


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

另外,如何填充对象存储区?可以在插入所有5个对象之前调用getAllProducts()函数吗?

答案 3 :(得分:0)

查找对象库中的错误以防万一,我在下面添加了。当事务触发String处理程序时,您只能知道没有其他产品;我将您的oncomplete移动到该事件处理程序。如果你仍然看到不完整的结果,那一定是别的。

console.log