javascript - 如何使用 idbKeyval 获取我的 IndexedDB val 的密钥?
问题描述
我正在使用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
orconst
而不是var
. 这是有效的,因为let
并且const
具有块范围而不是函数范围。本文有助于解释这一点。所以:
for (var i in keys) {
const key = keys[i];
// ...
// key will be preserved in block
}
就个人而言,我更喜欢Array.forEach
它只是因为它看起来更简单,并且可以保护您不必担心您所处的范围。
*最简单:直到刚才我才知道。
推荐阅读
- java - 瀑布图 - 条之间的空间
- java - 如何将参数添加到特定的 toast 函数?
- node.js - 结合 Mongo 模式
- junit - 在不同的测试方法上出现 InvalidUseOfMatchersException
- python - 等待完成在 Python 中执行指令
- mysql - 只有ECS时无法连接Golang中的RDS mysql
- facebook - SparkAR 通过屏幕点击和屏幕平移设置位置?
- javascript - net.Socket.remoteAddress 在节点 js 网络模块中的连接上未定义
- php - 如何从 2 个表创建嵌套的 json 对象查询?
- java - 带有圆角的 Android NavigationView