从 chrome.storage 中顺序检索多个项目

Joe*_*nin 1 javascript jquery asynchronous google-chrome-extension

我正在 Chrome 扩展程序中编写用户设置界面。以下是我定义设置的方式:

function Setting(label, type, defaultData) {
    this.label = label;
    this.type = 'checkbox';
    this.defaultData = defaultData;
}

var Settings = {};
Settings['setting-one'] = new Setting('Setting one', 'checkbox', 'true');
Settings['setting-two'] = new Setting('Setting two', 'checkbox', 'true');
Run Code Online (Sandbox Code Playgroud)

以下是我为每个设置设置默认值的方法:

function setDefaultSetting(setting, defaultValue) {
    chrome.storage.sync.get(setting, function(results) {
        if (!results[setting]) {
            // If the setting has not yet been defined, define it now
            var dataToSave = {};
            dataToSave[setting] = defaultValue;
            chrome.storage.sync.set(dataToSave, function() {
                debugMsg('set `' + setting + '` to ' + defaultValue);
            });
        }
    });
}

for (var setting in Settings) {
    if (Settings.hasOwnProperty(setting)) {
        var s = Settings[setting];
        if (s.type == 'checkbox') {
            setDefaultSetting(setting, s.defaultData);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。现在我想将设置列表打印为复选框。这是我尝试过的:

function printSettingsModal() {
    var output += '<form>';
    for (var setting in Settings) {
        if (Settings.hasOwnProperty(setting)) {
            var s = Settings[setting];
            if (s.type == 'checkbox') {
                chrome.storage.sync.get(setting, function(results) {
                    output += '<p><input id="setting-' + setting + '" type="checkbox"';
                    if (results[setting] == 'true') { output += ' checked="checked"'; }
                    output += '><label for="setting-' + setting + '">' + s.name + '</label></p>';
                });
            }
        }
    }
    output += '</form>';
    return output;
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它chrome.storage.sync.get()是异步的。如何循环遍历设置数组并检索chrome.storage每个设置的关联数据?

Xan*_*Xan 5

实际上,您不必按顺序执行此操作,甚至不必事先明确设置默认值。

chrome.storage.local.get第一个参数有 3 种形式:

  • "key"(字符串):仅检索一个密钥,就像您所做的那样
  • ["key1", "key2"](数组):检索数组中键的所有值
  • { key1: default1, key2: default2 }(字典对象):检索指定键的所有值,如果提供的默认值不在存储中,则返回该默认值

您可以收集想要检索的所有设置并通过一项操作获取它们。