Using a variable key in chrome.storage.local.set [

2019-01-25 23:16发布

问题:

This question already has an answer here:

  • chrome.storage.local.set using a variable key name 2 answers

I am creating a chrome-extension. I don't know how to use a variable as the key to chrome.storage.local.set() function. I have tried

var key = 'myKey';
chrome.storage.local.get(key, function(val) { 
    chrome.storage.local.set({key:val[key]+param1}); //appending  param1
    alert(val[key]);
}

Here i am trying to get the value of val[key] and append a string param1 and place it back to the storage using the same key. But I am not able to do so. the alert box displays undefined all the time.


But when I try without the variable key , it works fine.

chrome.storage.local.get('myKey', function(val) { 
    chrome.storage.local.set({myKey:val['myKey']+param1}); //appending  param1
    alert(val['myKey']);
}

The problem is that I am using chrome.storage.local.set can have arguments of not only string but also objects.

回答1:

In JavaScript, the only way to use a non-static variable name is by assigning a value as a property, instead of using object literals.

var key = 'myKey';
var param1 = 'whatever';
chrome.storage.local.get(key, function(val) {
    // Create property if does not exist (yet)
    if (typeof val[key] != 'string') val[key] = '';
    // Append value of param1
    val[key] += param1;
    // Save data
    chrome.storage.local.set(val);
    alert(val[key]);
});

Note: You might want to verify that set succeeded. This can be done by using a callback. For instance:

    chrome.storage.local.set(val, function() {
        if (chrome.extension.lastError) {
            alert('An error occurred: ' + chrome.extension.lastError.message);
        }
    });


回答2:

I have solved the problem. Instead of using chrome.storage.local.set({key:val[key]+param1});

I have replaced the json string {key:val[key]+param1} with an object.

var obj = {};       
var key = "myKey";  
obj[key] += param1;   
chrome.storage.local.set(obj);

Here obj has value {"myKey":"the appended value"}