Как получить ключ моего Val IndexedDB, используя idbKeyval? - PullRequest
0 голосов
/ 11 марта 2019

Я использую библиотеку idbKeyval для сохранения / извлечения данных из локального хранилища IndexedDB.У меня есть функция, чтобы перебрать все мои ключи и получить каждый соответствующий объект.Однако когда я получаю каждый объект (val), мне нужно знать соответствующий ему ключ (именно так я соотносю объект с элементом в DOM).Но поскольку API IndexedDB (и idbKeyval) является асинхронным, я теряю ссылку на соответствующий ключ.Есть ли способ получить соответствующий 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 Ответ

1 голос
/ 11 марта 2019

Существует два три решения для этого.Вы можете либо создать 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.Это работает, потому что let и const имеют область видимости вместо области функций. Эта статья помогает объяснить это. Итак:

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

Лично я бы предпочел Array.forEach только потому, что он выглядит проще и защищает вас от необходимости беспокоиться о том, какую область вы ''

* Самое простое: я понятия не имел до момента.

...