油猴异步等待问题

swhoro
  • 14

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

(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,则页面会卡死,进一步证明上面的猜想

回复
阅读 221
1 个回答

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

var timer;
timer = setInterval(function() {
  var lock = getlock();
  if (lock == 0) {
    setval()
    clearInterval(timer)
  }
},500)
你知道吗?

宣传栏