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

时间:2019-03-11 19:17:03

标签: javascript indexeddb

我正在使用 idbKeyval 库从IndexedDB本地存储中保存/检索数据。我有一个遍历所有键并获取每个对应对象的函数。但是,当我检索每个对象(val)时,我需要知道其对应的键(这就是我如何将该对象与DOM中的元素相关联)。但是由于IndexedDB(和idbKeyval)api是异步的,因此我无法引用相应的键。检索key时,是否可以检索对应的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库:https://github.com/jakearchibald/idb-keyval

1 个答案:

答案 0 :(得分:1)

two 三个解决方案。您可以创建一个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具有块作用域而不是函数作用域。 This article helps explain that.这样:

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

我个人更希望Array.forEach只是因为它看起来更简单,并且可以保护您不必担心自己所处的范围。

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