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:使用存储键值对的变量将缓存添加到先前的解决方案,但这是对读者的练习(周围可能有现有的库/示例)。
添加回答
举报