代码之家  ›  专栏  ›  技术社区  ›  rampion

使用GM\u getValue GM\u setValue实现锁

  •  0
  • rampion  · 技术社区  · 14 年前

    我认为脚本实例之间唯一的通信渠道是 GM_setValue / GM_getValue ,允许实例访问键/值存储。

    GM_setLock GM_releaseLock ),因此我可以执行以下操作:

    GM_setLock();
    const tried_update = GM_getValue(available_version);
    GM_setValue(available_version, true);
    GM_releaseLock();
    
    if (!tried_update) { prompt_user() }
    

    如果没有锁定,我可以在不同的选项卡中有多个实例,所有这些实例都可以读取 GM_getValue(available_version) 在他们到达之前 GM_setValue(available_version, true) ,因此可以多次ping用户。

    问题是,如果我只能访问(我愿意假装的是)一个原子读取和一个原子写入操作(并且没有原子写入和返回以前的值),我不知道如何实现从头顶锁定。有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Brock Adams    14 年前

    在Greasemonkey中,您不能完全使用这种语法,但类似的内容应该可以满足您的需要:

    function UpgradeCheckFunction ()
    {
        //--- Put payload code here.
    
        alert ("I just ran an an upgrade check?!");
    }
    

    .
    然后定义 PerformOnceAcrossTabs() ,就像这样:

    function PerformOnceAcrossTabs (sName, oFunction)
    {
        var OldValue    = GM_getValue (sName);
        if (OldValue)
        {
            //--- Optionally also do a timestamp check and clear any "locks" that are X hours old.
            return;
        }
    
        GM_setValue (sName, new Date().toString() );
    
        //--- run payload function here.
        (oFunction)();
    
        //--- Clear "Lock".
        GM_deleteValue (sName);
    }
    

    .
    那就这样说吧:

    PerformOnceAcrossTabs ("UpgradeCheckLock", UpgradeCheckFunction);