首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GM_getValue GM_setValue实现锁

使用GM_getValue GM_setValue实现锁
EN

Stack Overflow用户
提问于 2010-09-18 04:48:19
回答 1查看 671关注 0票数 0

我有一个greasemonkey脚本,当它运行时,它会检查是否有更新可用,如果有,会提示用户下载更新。这通常工作得很好,除了如果用户同时打开多个标签(例如,在启动浏览器时,或者在书签文件夹中使用"Open All in Tabs“),greasemonkey脚本将同时在每个标签中ping用户,这对用户来说有点像皮塔。

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

我需要做的是想出一个锁定方案(让我们称之为GM_setLock/GM_releaseLock),这样我就可以执行以下操作:

代码语言:javascript
复制
GM_setLock();
const tried_update = GM_getValue(available_version);
GM_setValue(available_version, true);
GM_releaseLock();

if (!tried_update) { prompt_user() }

如果没有锁定,我可能会让不同选项卡中的多个实例在其中任何一个访问GM_setValue(available_version, true)之前都读取GM_getValue(available_version),因此用户可能会被pinged多次。

问题是,如果我只能访问(我愿意假装是)原子读和原子写操作(没有原子写和返回之前的值),我就不知道如何实现锁定。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-18 06:58:08

您不能完全使用Greasemonkey中的语法来做到这一点,但是像这样的语法应该可以做您想要的事情:

包装升级检查(或其他内容),如下所示:

代码语言:javascript
复制
function UpgradeCheckFunction ()
{
    //--- Put payload code here.

    alert ("I just ran an an upgrade check?!");
}

然后定义PerformOnceAcrossTabs(),如下所示:

代码语言:javascript
复制
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);
}

然后这样叫它:

代码语言:javascript
复制
PerformOnceAcrossTabs ("UpgradeCheckLock", UpgradeCheckFunction);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3738924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档