gpt4 book ai didi

javascript - 如何使用 idbKeyval 获取我的 IndexedDB val 的 key ?

转载 作者:行者123 更新时间:2023-12-03 00:02:37 25 4
gpt4 key购买 nike

我正在使用 idbKeyval 库从 IndexedDB 本地存储保存/检索数据。我有一个函数可以迭代所有键并获取每个相应的对象。但是,当我检索每个对象 (val) 时,我需要知道其相应的键(这就是我将对象与 DOM 中的元素关联起来的方式)。但由于 IndexedDB(和 idbKeyval)api 是异步的,我失去了对相应键的引用。有没有一种方法可以在检索 val 时检索相应的 key?下面是一个片段,可以更好地描述我正在尝试做的事情:

var customStore = new idbKeyval.Store('my-db', 'offline-transactions');
idbKeyval.keys(customStore)
.then(function (keys) {
for (var i in keys) {
var key = keys[i];
var val = idbKeyval.get(key, customStore)
.then(function (val) {

//THIS WORKS:
console.log(val);

//THIS DOES NOT WORK:
console.log(key);
//'KEY' IS OUT OF SCOPE HERE
//WHAT IS A GOOD WAY TO GET THE CORRESPONDING KEY FOR MY VAL HERE?

});
}
});

我正在使用 idbKeyval 库:https://github.com/jakearchibald/idb-keyval

最佳答案

对此有 两个 三个解决方案。您可以创建 IIFE (旧方法)并设置一个局部变量以从循环中“复制”该变量:

.then(function(val) {
(() => {
var localKey = key;
// ...
// localKey will be preserved since it's encapsulated
// in its own functional scope
})();
}

或者你可以使用更优雅的Array.forEach ES6方法:

keys.forEach((key) => {
var val = // ...
// No need to copy key here since we're in a new functional
// scope by the nature of .forEach
});

这两种方法本质上是相同的——您通过为循环的每次迭代创建一个新的函数作用域来保留变量。

希望这有助于澄清一些事情。

编辑

我错过了最简单的*解决方案:在 for 循环中使用 letconst 而不是 var。这是可行的,因为 letconst 具有 block 作用域而不是函数作用域。 This article helps explain that.所以:

for (var i in keys) {
const key = keys[i];
// ...
// key will be preserved in block
}

就我个人而言,我更喜欢 Array.forEach,因为它看起来更简单,并且可以让您不必担心自己所处的范围。

*最简单:直到刚才我才知道。

关于javascript - 如何使用 idbKeyval 获取我的 IndexedDB val 的 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55108878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com