如何在for of循环中等待指定变量定义完成后再进入下一轮迭代
解决方案
你可以封装一个轮询查询GM值的Promise方法,替代固定时长的等待逻辑:只有当目标值非空已定义时才会结束等待进入后续逻辑,同时可以配置轮询间隔和最长超时时间避免死等。
步骤1:封装轮询等待工具函数
/** * 等待GM值就绪 * @param {string} key 要查询的GM存储key * @param {number} interval 轮询间隔(毫秒),默认200ms * @param {number} timeout 最长超时时间(毫秒),默认30000ms即30秒 * @returns {Promise<any>} 拿到的非空值 */ function waitForGmValue(key, interval = 200, timeout = 30000) { return new Promise((resolve, reject) => { const startTime = Date.now(); // 轮询逻辑 const check = async () => { const value = await GM.getValue(key); // 值已定义且非空就返回 if (value !== undefined && value !== null) { resolve(value); return; } // 超过超时时间就抛错 if (Date.now() - startTime > timeout) { reject(new Error(`等待GM值${key}超时`)); return; } // 间隔指定时间后再查 setTimeout(check, interval); }; check(); }); }
步骤2:修改原循环逻辑
const $j_object = $(".name"); for (const element of $j_object) { // 直到value_name就绪才会往下走,代替固定3秒等待 const value_name = await waitForGmValue("value_name"); // 后续处理逻辑 }
可选优化点
- 如果你的
value_name是通过其他异步事件更新的,优先用事件监听代替轮询,性能更好,比如值更新时触发自定义事件,在等待逻辑里监听事件即可 - 可以根据你的业务场景调整轮询间隔和最长超时时间,比如值更新频率高就把间隔设短一点
内容的提问来源于stack exchange,提问作者Henrik Petterson
相关产品推荐
相关产品推荐

