javascript - 如何使用 Firefox 中的扩展存储关闭后仍然存在的数据
问题描述
我正在使用 WebExtension 编写一个 Firefox 扩展,它存储在窗口中打开的选项卡的数据并将其保存以供以后使用。它类似于 MS Edge 中的一个功能。为了存储持久数据,我使用 storage.local API 但是,当我测试数据的存储和检索是否正常工作时,我在检索数据时遇到了麻烦。我还应该提到我是 Promises 的新手。
我有一个对象 dataToStore{id,tabs[],numOfTabs,tags} 我发送以使用browser.storage.local.set(dataToStore);
然后我有一个对象 dataRetrieved{} 用于存储返回的browser.storage.local.get(null)
返回一个 Promise
这是代码:
//At this state dataToStore has the necessary data inserted in it
console.log(dataToStore);
browser.storage.local.set(dataToStore);
let dataRetrieved={};
dataRetrieved = browser.storage.local.get(null).then(() => {
console.log(dataRetrieved);
});
的输出console.log(dataToStore);
是:
Object { id: 1563507620695, tabs: (3) […], numOfTabs: 3, tags: null }
这是预期的。但是的输出console.log(dataRetrieved);
是:
Promise { <state>: "pending" }
我期待两个输出是相同的。据我所知, .then 中的行应该只在承诺返回值后运行。然而,这里似乎并非如此。如何访问存储的值?
参考: 存储的MDN
来自 MDN Github第 19,33 行的示例
解决方案
Promise
是一个async
函数,这意味着它将被放入队列中并按顺序完成。
一旦它开始,如果你需要一个结果,Promise
你必须等待它完成工作。
另请阅读我对以下内容的回答:理解承诺:需要结合多个结果
例如,在您的代码中
(async () => {
console.log(dataToStore);
await browser.storage.local.set(dataToStore); // wait for it to be done before going to the next line
const dataRetrieved = await browser.storage.local.get(); // wait for it
console.log(dataRetrieved);
})();
您也可以更改它们
console.log(dataToStore);
browser.storage.local.set(dataToStore).then(() => {
// after it is done
browser.storage.local.get().then((dataRetrieved) => {
// after it is done
console.log(dataRetrieved);
});
});
推荐阅读
- cpu-architecture - 虚拟化页表的工作原理
- javascript - javascript循环嵌套数组并基于另一个数组提取属性
- python-3.x - 为什么 tkinter 条目中的 selection_clear() 无效?
- swift - 调用完成处理程序 Firebase Swift
- php - 如何使用 PDO ssl 连接到 azure mysql 数据库
- java - 在Java中从数组中获取随机元素而不重复
- arrays - 弹性搜索使用 javascript 将 json 对象数组展平为单级
- c# - 根据父母一次性返回一次性
- jquery - jQuery replaceWith() - 重新使用删除的值
- r - 我正在尝试绘制比例而不是我在 R 中的 ggplot2 中的比例,但我不确定如何去做