仅使用chrome.storage.local.set更新指定的元素

时间:2018-11-12 18:16:56

标签: javascript google-chrome-extension

我在chrome本地存储中有一个数组,格式为:

{"flights":
   [
      {"end":"2018-02-10","price":"476","start":"2018-02-01","tabId":1129367822},
      {"end":"2018-02-11","price":"493","start":"2018-02-01","tabId":1129367825},
      {"end":"2018-02-12","price":"468","start":"2018-02-01","tabId":1129367828}
   ]
}

现在,我以这种方式更新所有数据:

function updateValue(index, item) {
    chrome.storage.local.get(['flights'], function (response) {
        response.flights[index] = item;
        chrome.storage.local.set({flights: response.flights});
    });
}

但是异步请求存在问题,因为当时我有多个请求。一些请求会获取旧数据,然后再次将其保存在存储中...

我只想更新指定的元素(例如,使用新数据更新flight [0]),但是它不起作用... 像这样,但可行的:

    chrome.storage.local.set({flights[0]: item});

有没有办法做到这一点?或者,也许您有一些建议以其他方式解决此问题。

非常感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您可以将每个排期保存到单独的密钥中,并通过遍历所有存储空间来获取所有排期:

cosnt flightPrefix = 'flight_';    

function updateValue(index, item) {
    chrome.storage.local.set({flightPrefix + index: item});
}

function getFlights() {
    // Pass in null to get the entire contents of storage.
    chrome.storage.sync.get(null, function(items) {
        let flights = Object.keys(items).filter(key => key.beginsWith(flightPrefix));
        console.log(flights);
    });
}

答案 1 :(得分:1)

基于交易”的回答(该代码有一些错误)。 我是这样写的:

function parseFlight(result) {
    let flightsArray = [];
    Object.keys(result).forEach(function (key) {
        if (key.includes('flight')) {
            let index = key.replace('flight_', '');
            flightsArray[index] = result[key];
        }
    });
    return flightsArray;
}

function updateValue(index, item) {
    let flightPrefix = 'flight_';
    let obj = {};
    obj[flightPrefix + index] = item;
    chrome.storage.local.set(obj);
}

chrome.storage.local.get(null, function (result) {
    let flights = parseFlight(result);
});

感谢帮助!