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);
    };
}