1 回答

TA貢獻1893條經驗 獲得超10個贊
這是任何異步存儲的標準問題,并非特定于擴展。
解決方案 1. 使用同步window.localStorage. 它只能存儲字符串,因此您需要 JSON.stringify 和 JSON.parse 來處理復雜數據。性能方面,假設數據小于幾千字節,則沒有區別,但如果有更多,則不要使用此方法。
解決方案 2. 使用等待上一次調用完成的互斥讀/寫函數:
const storage = (() => {
let mutex = Promise.resolve();
const API = chrome.storage.sync;
const mutexExec = (method, data) => {
mutex = Promise.resolve(mutex)
.then(() => method(data))
.then(result => {
mutex = null;
return result;
});
return mutex;
};
const syncGet = data => new Promise(resolve => API.get(data, resolve));
const syncSet = data => new Promise(resolve => API.set(data, resolve));
return {
read: data => mutexExec(syncGet, data),
write: data => mutexExec(syncSet, data),
};
})();
用法:
async function example() {
const {myKey} = await storage.read({myKey: {}});
myKey.foo = 'bar';
await storage.write({myKey});
}
解決方案 3:使用存儲鍵值對的變量將緩存添加到先前的解決方案,但這是對讀者的練習(周圍可能有現有的庫/示例)。
添加回答
舉報