我正在使用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
有 二 三个解决方案。您可以创建一个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循环中使用let
或const
而不是var
。这是有效的,因为let
和const
具有块范围而不是函数范围。 This article helps explain that.所以:
for (var i in keys) {
const key = keys[i];
// ...
// key will be preserved in block
}
就个人而言,我更喜欢Array.forEach
,因为它看起来更简单,并且可以保护您不必担心自己的范围。
*最简单:我刚才不知道。