Chrome.storage.local.set 是否保证顺序/确定性



在我有 2 个按钮的情况下,but_A 和but_B。

but_A.onMouseClicked(chrome.storage.local.set({"key": "A"}, function(){
console.log("but_A val set"); }));
but_A.onMouseClicked(chrome.storage.local.set({"key": "B"}, function(){
console.log("but_B val set"); }));

如果我点击but_A,那么but_B,"key"对应的值是多少?行为是否具有确定性?

到目前为止,我推断: 当按下 A 时,第一个chrome.storage.local.set()将进入消息队列,弹出以堆叠并执行。当 A 的.set()仍在执行时,B 被按下。B 的.set()也将执行。这两个chrome.storage.local.set()会在两个单独的线程上同时运行吗?

谢谢!

JavaScript 中给定执行环境中的所有代码、函数、回调、事件、微任务等都将使用事件循环按顺序处理。没有线程。

但是,扩展 API 文档不能保证 API 内实际工作的顺序与调用顺序匹配,因此即使当前实现在内部执行此操作,也不是您应该依赖的。

您可以像这样链接承诺:

let setChain = Promise.resolve();
const set = data => {
setChain = setChain.then(() => new Promise(resolve => {
chrome.storage.local.set(data, resolve);
}));
};

现在你可以像set({foo: 1}); set({foo: 2});一样使用它

最新更新