2015-04-28 59 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 
} 
相关问题