我有一个greasemonkey脚本,当它运行时,它会检查是否有更新可用,如果有,会提示用户下载更新。这通常工作得很好,除了如果用户同时打开多个标签(例如,在启动浏览器时,或者在书签文件夹中使用"Open All in Tabs“),greasemonkey脚本将同时在每个标签中ping用户,这对用户来说有点像皮塔。
我认为脚本实例之间唯一的通信通道是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_setValue(available_version, true)之前都读取GM_getValue(available_version),因此用户可能会被pinged多次。
问题是,如果我只能访问(我愿意假装是)原子读和原子写操作(没有原子写和返回之前的值),我就不知道如何实现锁定。有什么想法吗?
发布于 2010-09-18 06:58:08
您不能完全使用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);https://stackoverflow.com/questions/3738924
复制相似问题