油猴异步等待问题

发布于 2022-09-13 00:05:14 字数 972 浏览 24 评论 0

尝试在油猴脚本中编写异步脚本

(async function () {
    let isLocked = 0;

    async function checkLock() {
        setTimeout(() => {
            isLocked = GM_getValue("settings").locked;
            console.log("isLocked值为:", isLocked);
        }, 500);
    }

    while (true) {
        await checkLock();
        if (isLocked == 0) {
            // 若当前存储没被锁,则使用存储,并上锁存储
            GM_setValue("settings", { locked: 1 });
            break;
        }
    }
    // 对存储进行处理相关代码
    // 解锁存储
    GM_setValue("settings", { locked: 0 });

    // 接下来的代码
})();

其中isLocked用于判断是否有其它页面同一脚本在对油猴内部的存储进行处理,若当前存储正在被其它页面脚本进行处理则休眠500ms,然后再次检查settings中的locked值;若没有脚本正在使用存储则上锁存储并对存储进行处理:

GM_setValue("settings", { locked: 1 }

想要的目标是若发现数据库被上锁(说明其他页面脚本正在使用存储)则500ms之后重新检查settings中的locked值,并且在这500ms内线程不应被阻塞(异步)
但是似乎在

await checkLock()

一行中并没有等待500ms,而是直接执行了接下来的if语句
并且若isLocked初始值不为0,则页面会卡死,进一步证明上面的猜想

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

扬花落满肩 2022-09-20 00:05:14

你这个场景需求也用不着这样啊,直接 setInterval 就好了,满足条件后 clearInterval 就行。干嘛要搞的这么复杂
伪代码

var timer;
timer = setInterval(function() {
  var lock = getlock();
  if (lock == 0) {
    setval()
    clearInterval(timer)
  }
},500)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文