如何获取forEach循环内setTimeout执行后累加的removeCount返回值
问题核心原因
你当前的代码无法拿到正确removeCount的原因是setTimeout属于异步宏任务,不会阻塞同步代码的执行流程,原函数会在所有定时器触发执行前就直接返回初始值0,你写的async/await没有实际生效,因为没有将定时器逻辑包装为可等待的Promise对象。
修正后可正常运行的代码
async function removeNeedlessNotifications(mutations) { // 存储所有异步定时器任务的Promise实例 const timerTasks = []; let removeCount = 0; mutations.forEach(mutationItem => { mutationItem.addedNodes.forEach((node, index) => { // 将每个定时器逻辑包装为独立Promise,存入任务列表 const singleTask = new Promise(resolve => { setTimeout(() => { if (notificationFilter(node)) { node.querySelector("div.activity-remove.js-remove").click(); removeCount++; } // 当前定时器逻辑执行完成后,标记Promise状态为已完成 resolve(); }, index * 100); }); timerTasks.push(singleTask); }); }); // 等待所有定时器任务全部执行完成 await Promise.all(timerTasks); // 此时计数已完成累加,返回正确值 return removeCount; }
实现说明
- 每个延时处理节点的逻辑都被包装为独立的Promise实例,统一存入任务列表管理
Promise.all会等待列表内所有异步任务全部执行完毕后才会继续执行后续代码- 最终返回的
removeCount就是所有节点处理完成后的累计值
调用示例
你可以通过以下两种方式拿到正确的移除计数:
// 方式1:then链式调用 removeNeedlessNotifications(mutations).then(count => { console.log('本次共移除通知数量:', count); }); // 方式2:在其他async函数内用await接收 const handleMutations = async () => { const removeCount = await removeNeedlessNotifications(mutations); // 后续处理逻辑 }
内容的提问来源于stack exchange,提问作者edass
相关产品推荐
相关产品推荐

