clearTimeout 不适用于 Node.js 中对象数组内的超时

clearTimeout not working for timeout inside an array of objects in Node.js

我正在使用 setTimeout 创建超时并将它们存储到一个对象数组中,代码如下 Node.js:

actionSensorTimers = [];

/* -------------- OTHER CODE -----------------*/

let delay = (actionStep.delay !== undefined) ? actionStep.delay : 0;

let timeout = {
    name: name,
    timeout: setTimeout(async function() {
        url += properties.join('&');
        await request(url, function(err, res, body) {});

        let previousState = {
            ...targetIotControlPoint,
            previousState: undefined
        }

        await iotConn.query('UPDATE ' + actionStep.type + 's SET previousState = ?'
            + ' WHERE name = ?', [JSON.stringify(previousState), targetIotControlPoint.name]);
    }, delay)
}
actionSensorTimers.push(timeout);

并且该代码完美运行:回调在延迟后成功触发,发出请求并更新数据库。但是,当我尝试使用以下代码取消 setTimeout 时,它仍然会在延迟后被触发。

let found = actionSensorTimers.find(timer => timer.name == name);
if (found !== undefined) {
    console.log(found);
    clearTimeout(found.timeout);
    actionSensorTimers = actionSensorTimers.filter(timer => timer.name != name);
}

Array.find() 成功找到对象并在控制台上记录对象(见下图),但超时没有被取消。

问题不应该在访问 actionSensorTimers[n].timeout 的范围内,因为 Array.find() 找到正确的对象并成功记录它。

感谢您的帮助!

var t= setTimeout(function(){ 警报("Hello111111111"); }, 5000); clearTimeout(t);有效!!!!!!

据我所知 Array.prototype.find() return 值的副本 我认为你使用对象的副本你应该使用同一个对象而不是副本

好的,事实证明问题出在我的 setTimeout 代码所在的循环中。我将两个超时对象推送到具有相同名称值但超时不同的数组。这导致我的查找系统 return 我是数组中名称匹配的第一个元素。

因为我想取消的超时是第二个,所以我一直没有得到正确的参考,并且总是试图取消已经 运行 的错误超时。 (见图片_called: true

我现在添加了一项检查,以防止两个具有相同名称参数的计时器进入我的对象数组。