You need to enable JavaScript to run this app. 如何获取forEach循环内setTimeout执行后累加的removeCount返回值
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 21:30:04