我正在尝试使用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");
};
}
答案 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