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
)
我现在添加了一项检查,以防止两个具有相同名称参数的计时器进入我的对象数组。
我正在使用 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
)
我现在添加了一项检查,以防止两个具有相同名称参数的计时器进入我的对象数组。