代码之家  ›  专栏  ›  技术社区  ›  Matt Spinks

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

  •  0
  • Matt Spinks  · 技术社区  · 7 年前

    我正在使用 idbKeyval公司 用于从IndexedDB本地存储中保存/检索数据的库。我有一个函数来遍历我的所有键,并得到每个对应的对象。但是,当我检索每个对象时( val ),我需要知道它对应的键(即如何将对象与DOM中的元素关联)。但由于IndexedDB(和idbKeyval)api是异步的,因此我失去了对相应键的引用。有没有办法检索相应的 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

    0 回复  |  直到 7 年前
        1
  •  1
  •   sheng    7 年前

    有 二 有三种解决方案。您可以创建 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
    });
    

    这两种方法的工作原理基本相同——通过为循环的每次迭代创建新的函数范围来保留变量。

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

    编辑

    我错过了最简单的解决方案:使用 let 或 const 在for循环中,而不是 var . 这是因为 允许 和 常数 具有块作用域而不是函数作用域。 This article helps explain that. 因此:

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

    就我个人而言,我更喜欢 大堆forEach公司 只是因为它看起来更简单,并且保护您不必担心您所处的范围。

    * 最简单的:我刚才才知道。