【问题标题】:does chrome.storage.local.set guarantee order / deterministicchrome.storage.local.set 是否保证顺序/确定性
【发布时间】:2020-10-11 21:22:27
【问题描述】:

在我有 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 google-chrome-extension deterministic non-deterministic


    【解决方案1】:

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

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

    你可以像这样链接一个 Promise:

    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}); 一样使用它

    【讨论】:

    • 如果顺序不确定,您建议如何实现以下目标: 新标签页有一个输入字段,用于接收数据。用户输入数据并点击“保存”按钮。然后下次用户打开一个新的标签页时,数据就会显示出来。保存数据和访问数据之间不会总是存在竞争条件吗?
    • 这取决于您如何访问它。在同一选项卡的单个生命周期内,您可以通过 Promise 链接,所以这不是问题。至于保存在一个选项卡中并在另一个选项卡中阅读,是的,这很有趣,但实际上不太可能发生,因为保存/阅读比创建新选项卡更快。您可以使用信号量(互斥量)来避免第二种情况下的种族性,例如通过持久的后台脚本和 chrome.extension.getBackgroundPage。
    猜你喜欢
    • 2021-11-20
    相关资源
    最近更新 更多