正在寻找正确的方法来使用INDEXEDDB数据存储的get()方法



我正试图使用一个简单的indexeddb'get'方法从现有的数据存储中检索一个键控记录。由于某种原因,我一直找不到,尽管我的"get"请求的结果是"successful",但返回的值是"undefined"。

下面的代码是从一个事件侦听器调用的,当用户单击表的一行中的按钮时,该侦听器将被激发,这表明用户想要该特定行的详细信息。表中的每一行表示indexeddb数据存储中已创建的一条记录。每行中有8个感兴趣的值,但在我的html表中只显示了3个。我只是试图访问数据存储中的行以获取所有8个值,以便将它们传递给下一个进程。

以下代码是从在每行的"Select"按钮上创建的事件侦听器中调用的。。。

async function getGameInProgressDetails(gameID) {
try {
db = await idbConnect(DBName,DBVersion);
let tx = db.transaction(['gamesList'], 'readonly');
let gameStore = tx.objectStore('gamesList');
// I have confirmed the 'gameID' passed in is the key value that i would expect
// to retrieve the desired result.
let req = gameStore.get(gameID);  // gameID comes from the selected row in the html table.

req.onsuccess = (ev) => {
console.log('Success');
let request = ev.target;
console.log(request); // returns an IDBRequest object with result: undefined and error: null.
let theGame = request.result;
console.log(theGame );  // displays 'undefined'.
}
req.onerror = (err) => {
console.warn(err);
};


} catch (e) {
console.warn(e);
}

我收到"success"消息,表示"get"操作成功,但我的结果是"undefined"。有人能告诉我,我是否错过了一步,或者是否有其他方法可以解决这个问题,我应该研究一下?我看过各种各样的教程,肯定忽略了一些"显而易见"的东西。

我发现了代码/方法的问题,正在回答我自己的问题。上面的代码不起作用的原因根本不是因为我的indexeddb代码或逻辑。

我发现,在get((方法调用之前,我传递给例程的索引值需要转换为整数,JS将其视为字符串值。我感到困惑的是,我在console.log语句中检查了该值,它显示了适当的值。我没有考虑的是JS如何评估变量值的类型。

对于那些后来看到这一点的人来说,我的最终代码是:

async function getGameInProgressDetails(gameID) {
db = await idbConnect(DBName,DBVersion);
let tx = db.transaction(['gamesList'], 'readonly');
var gameStore = tx.objectStore('gamesList');

let gameIndex = gameStore.index("gameIDIdx");
let request = gameIndex.get(parseInt(gameID));  //!! NOTE THE parseInt!!

request.onsuccess = function() {
if (request.result !== undefined) {
console.log("Games", request.result);
} else {
console.log("No such games.");
}
}

最新更新