Uncaught InvalidStateError: Failed to read the 'result' property from 'IDBRequest': The request has not finished
Uncaught InvalidStateError: Failed to read the 'result' property from 'IDBRequest': The request has not finished
我需要你们的帮助。
我正在使用 indexedDB
。我需要使用 Javascript
从数据库中的 table 读取记录,但我收到一条错误消息,指出来自 Chrome 浏览器 V52 Uncaught InvalidStateError: Failed to read the 'result' 属性 来自 'IDBRequest': 请求尚未完成。
下面是我的Javascript代码
变量数据库;
var availableJobs = 0;
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
var request = window.indexedDB.open("MyDbName", 1);
request.onsuccess = function (event) {
db = request.result;
}
request.onblocked = function (event) {
db = "blocked...";
};
request.onerror = function (event) {
db = "Error...";
};
var objectStore = db.transaction("ActionCard").objectStore("ActionCard");
objectStore.openCursor().onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
if (cursor.value.ActionCardStatusId == 1 || cursor.value.ActionCardStatusId == 3) {
availableJobs++;
}
cursor.continue();
}
$("#availableJobs").html(availableJobs);
}
我在这一行收到一条错误消息
var objectStore = db.transaction("ActionCard").objectStore("ActionCard");
你需要了解如何编写异步Javascript。您的 db 变量在您访问它时未定义。
不要这样做:
var r = indexedDB.open();
var db = null;
r.onsuccess = function(event) { db = event.target.result); }
这样做:
var r = indexedDB.open();
r.onsuccess = function(event) {
var db = event.target.result;
};
是的,这意味着 db 在 onsuccess 函数的范围之外不可用。停止尝试在其范围之外使用它,否则您将 运行 陷入您遇到的问题。
您可以像这样分配数据库并在外部使用它,如您所愿,或在函数中用于 add/put 或从 IndexedDB 中获取或删除。下面是样片。
var db;
var request = window.indexedDB.open("db_name", 1);
request.onupgradeneeded = function() {
var db = request.result;
var storeName = db.createObjectStore("storeName", {keyPath: "keyAttribute"});
storeName.createIndex("testIndex", "testCase", { unique: false });
};
request.onerror = function(event) {
// Do something with request.errorCode!
console.log("failed opening DB: "+request.errorCode)
};
request.onsuccess = function(event) {
// Do something with request.result!
db = request.result;
console.log("opened DB")
};
//Adding function - can pass values as function params
function addData(objectStoreName){
// Start a new transaction
var transaction = db.transaction(objectStoreName, "readwrite");
var objectStore = transaction.objectStore(objectStoreName);
// Add some data
var request = objectStore.put({testCase: 'ddi',timestamp: performance.now(), name: "testname2", data: 'asdsadas'});
request.onsuccess = function(event) {
// event.target.result === customer.ssn;
console.log("request.onsuccess: "+event.target.result);
};
request.onerror = function(event) {
// event.target.result === customer.ssn;
console.log("request.onerror: "+request.errorCode);
};
transaction.oncomplete = function(event) {
console.log("All added to "+objectStore+"!");
};
transaction.onerror = function(event) {
// Don't forget to handle errors!
console.log("Error in adding data to "+objectStore+"!");
};
}
function getData(objectStoreName){
// Start a new transaction
var transaction = db.transaction(objectStoreName, "readwrite");
var objectStore = transaction.objectStore(objectStoreName);
var index = objectStore.index("TestCaseIndex");
// Query the data
var getDDIData = index.get("ddi");
getDDIData.onsuccess = function() {
console.log(getDDIData.result);
};
}
我需要你们的帮助。
我正在使用 indexedDB
。我需要使用 Javascript
从数据库中的 table 读取记录,但我收到一条错误消息,指出来自 Chrome 浏览器 V52 Uncaught InvalidStateError: Failed to read the 'result' 属性 来自 'IDBRequest': 请求尚未完成。
下面是我的Javascript代码
变量数据库; var availableJobs = 0;
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
var request = window.indexedDB.open("MyDbName", 1);
request.onsuccess = function (event) {
db = request.result;
}
request.onblocked = function (event) {
db = "blocked...";
};
request.onerror = function (event) {
db = "Error...";
};
var objectStore = db.transaction("ActionCard").objectStore("ActionCard");
objectStore.openCursor().onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
if (cursor.value.ActionCardStatusId == 1 || cursor.value.ActionCardStatusId == 3) {
availableJobs++;
}
cursor.continue();
}
$("#availableJobs").html(availableJobs);
}
我在这一行收到一条错误消息
var objectStore = db.transaction("ActionCard").objectStore("ActionCard");
你需要了解如何编写异步Javascript。您的 db 变量在您访问它时未定义。
不要这样做:
var r = indexedDB.open();
var db = null;
r.onsuccess = function(event) { db = event.target.result); }
这样做:
var r = indexedDB.open();
r.onsuccess = function(event) {
var db = event.target.result;
};
是的,这意味着 db 在 onsuccess 函数的范围之外不可用。停止尝试在其范围之外使用它,否则您将 运行 陷入您遇到的问题。
您可以像这样分配数据库并在外部使用它,如您所愿,或在函数中用于 add/put 或从 IndexedDB 中获取或删除。下面是样片。
var db;
var request = window.indexedDB.open("db_name", 1);
request.onupgradeneeded = function() {
var db = request.result;
var storeName = db.createObjectStore("storeName", {keyPath: "keyAttribute"});
storeName.createIndex("testIndex", "testCase", { unique: false });
};
request.onerror = function(event) {
// Do something with request.errorCode!
console.log("failed opening DB: "+request.errorCode)
};
request.onsuccess = function(event) {
// Do something with request.result!
db = request.result;
console.log("opened DB")
};
//Adding function - can pass values as function params
function addData(objectStoreName){
// Start a new transaction
var transaction = db.transaction(objectStoreName, "readwrite");
var objectStore = transaction.objectStore(objectStoreName);
// Add some data
var request = objectStore.put({testCase: 'ddi',timestamp: performance.now(), name: "testname2", data: 'asdsadas'});
request.onsuccess = function(event) {
// event.target.result === customer.ssn;
console.log("request.onsuccess: "+event.target.result);
};
request.onerror = function(event) {
// event.target.result === customer.ssn;
console.log("request.onerror: "+request.errorCode);
};
transaction.oncomplete = function(event) {
console.log("All added to "+objectStore+"!");
};
transaction.onerror = function(event) {
// Don't forget to handle errors!
console.log("Error in adding data to "+objectStore+"!");
};
}
function getData(objectStoreName){
// Start a new transaction
var transaction = db.transaction(objectStoreName, "readwrite");
var objectStore = transaction.objectStore(objectStoreName);
var index = objectStore.index("TestCaseIndex");
// Query the data
var getDDIData = index.get("ddi");
getDDIData.onsuccess = function() {
console.log(getDDIData.result);
};
}