Обратный вызов функции, локальные переменные и chrome.storage.sync.get

0

Это скорее эстетический вопрос, чем реальная проблема. Код, предлагаемый Google, отлично работает. Тем не менее, я не чувствую себя комфортно писать.

Когда вы пишете расширения Google Chrome, вы можете использовать постоянное хранилище. Он извлекается с использованием определенной функции, например:

chrome.storage.sync.get("cake", function(result) {
    alert(result["cake"]);
});

Все в порядке. Теперь, если вы хотите итерировать множество значений из хранилища, он может выглядеть следующим образом:

var keys = new Array("cake", "pie", "squirrel");
$.each(keys, function() {
    var key = $('<div>').append(this).html(); // ignore this line
    chrome.storage.sync.get(key, function(result) {
        alert(result[key]);
    });
});

Это работает отлично. Кроме того, я не могу поколебать мысль о том, что вы технически используете функцию обратного вызова, которая использует локальную переменную внешней функции, которая изменяется итерацией. Я собираюсь считать невозможным, чтобы обратный вызов произошел после того, как он завершил этот цикл итерации, но в других ситуациях (например, событие jQuery click) вы могли бы использовать неправильное значение ключевой переменной.

Это было бы хорошо, если бы вы могли всегда извлекать ключ из результата. Как это:

var keys = new Array("cake", "pie", "squirrel");
$.each(keys, function() {
    var key = $('<div>').append(this).html(); // ignore this line

    chrome.storage.sync.get(key, function(result) {
        var key;
        for (key in result) {}

        alert(result[key]);
    });
});

Но вы не можете, если он не найдет существующее значение в хранилище. Вместо того, чтобы возвращать объект, у которого есть свойство, равное null, он возвращает значение без свойств (так что вы не можете получить имя свойства). Это не дает вам возможности получить первоначально запрошенный ключ внутри функции.

Думаю, это не проблема, поскольку она работает. Мне просто не нравится писать такие вещи. Или я ошибаюсь, думая, что это странный код? Или, может быть, есть способ сделать это более правильно?

  • 0
    В чем проблема? Я прочитал ваш вопрос дважды, но не могу с уверенностью сказать, что вы спрашиваете. Однако у меня есть сильное чувство, что вам интересно, что можно читать / писать несколько ключей одновременно, передавая словарь (со значениями по умолчанию).
  • 0
    Каждый вызов внешней функции обратного вызова создает отдельное замыкание, поэтому key имени во внутренней функции всегда будет привязан к правильному значению. Нет способа, которым вы можете «использовать неверное значение ключевой переменной».
Показать ещё 3 комментария
Теги:
google-chrome-extension

1 ответ

2

Ну, у вас есть довольно странная проблема. StorageArea.get принимает ключ или массив ключей в качестве первого параметра. Таким образом, вы можете написать свой код следующим образом:

var keys = ["cake", "pie", "squirrel"];
chrome.storage.sync.get(keys,function(result){
    keys.forEach(function(key){
        alert(result[key]);
    }) 
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню