Javascript 如何使用idbKeyval获取我的IndexedDB val的密钥?

Javascript 如何使用idbKeyval获取我的IndexedDB val的密钥?,javascript,indexeddb,Javascript,Indexeddb,我正在使用idbKeyval库从IndexedDB本地存储中保存/检索数据。我有一个函数来遍历我所有的键并得到每个对应的对象。但是,当我检索每个对象(val)时,我需要知道它对应的键(这就是我如何将对象与DOM中的元素关联)。但是由于IndexedDB(和idbKeyval)api是异步的,因此我失去了对相应键的引用。当我检索我的val时,是否有办法检索相应的键?下面是一个片段,它更好地描述了我正在尝试做的事情: var customStore = new idbKeyval.Store('my

我正在使用idbKeyval库从IndexedDB本地存储中保存/检索数据。我有一个函数来遍历我所有的键并得到每个对应的对象。但是,当我检索每个对象(
val
)时,我需要知道它对应的键(这就是我如何将对象与DOM中的元素关联)。但是由于IndexedDB(和idbKeyval)api是异步的,因此我失去了对相应键的引用。当我检索我的
val
时,是否有办法检索相应的
?下面是一个片段,它更好地描述了我正在尝试做的事情:

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库:

有两种解决方案。您可以创建(旧方法)并将局部变量设置为“复制”循环中的变量:

.then(function(val) {
    (() => {
        var localKey = key;
        // ...
        // localKey will be preserved since it's encapsulated
        // in its own functional scope
    })();
}
或者您可以使用更优雅的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循环中使用
let
const
,而不是
var
。这是因为
let
const
具有块作用域而不是函数作用域。因此:

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

*最简单的:我刚才还不知道

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