异步结构中如何回到函数开头重新执行?setTimeout调用dat不生效怎么解决
问题根因
arguments.callee指向的是then的回调函数本身,直接调用该回调不会重新执行dat(),也就不会触发点击逻辑和后续的条件判断,自然达不到检测效果。同时arguments.callee在ES5严格模式下已被禁用,本身就不推荐使用。- 原代码末尾多余调用了一次
dat(),属于无效冗余逻辑。
修复方案
将整个检测流程封装为独立函数,需要重试时直接调用该函数即可,修复后代码如下:
const dat = async () => { await document.querySelector("body").click(); } // 封装独立的检测逻辑 const checkPosition = async () => { await dat(); // 用includes代替indexOf判断,可读性更高 if(!document.querySelector("body").className.includes("position")){ console.log("right"); } else { // 间隔1秒后重新执行整个检测流程 setTimeout(checkPosition, 1000); } } // 启动首次检测 checkPosition();
如果点击操作后className是异步更新的,await dat()执行完后className还没完成修改,可以在判断前增加短延迟适配场景:
// 延迟工具函数 const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); const dat = async () => { await document.querySelector("body").click(); } const checkPosition = async () => { await dat(); // 点击后等待50毫秒再判断,适配异步更新场景,时长可按需调整 await delay(50); if(!document.querySelector("body").className.includes("position")){ console.log("right"); } else { setTimeout(checkPosition, 1000); } } checkPosition();
内容的提问来源于stack exchange,提问作者aliveli49
相关产品推荐
相关产品推荐

