【发布时间】:2017-07-15 14:47:21
【问题描述】:
if (Object.keys(globalObject).length != 0) {
Object.keys(globalObject).forEach(function(key) {
database.query('SELECT * from accounts WHERE `ID` = ' + key + ' LIMIT 1', function(error, rows, fields) {
if (rows.length == 0) return;
console.log('User has ' + globalObject[key].length + ' items')
globalObject[key].forEach(function(item) {
console.log('Item ID is ' + item.id)
});
delete globalObject[key]
})
})
}
globalObject 示例(根据连接的用户和每个用户项不断变化):
globalObject = { "1001":[{id:1},{id:2}], "1002":[{id:2},{id:3}]}
有时我会遇到致命错误,崩溃:
TypeError: Cannot read property 'length' of undefined
在这一行:
console.log('User has ' + globalObject[key].length + ' items)
尽管在任何时候从程序的不同部分推送不同的用户,我删除 globalObject[key] 的唯一地方是在我处理完用户之后。
那么当我通过一个迭代器 (forEach) 访问它时,为什么一个键不能存在(未定义),它确保该键存在并且直到最后才会被删除?
编辑:
我认为原因是我在 setInterval(每 200 毫秒)内调用了 forEach,因此在 forEach 完成之前再次调用它,因此删除了密钥。我怎样才能使它更加同步以避免在很短的时间内为相同的键调用两次?
【问题讨论】:
-
如果一个对象没有键(一个空对象),它显然会给你一个错误。
-
您当前问题之外的一个小改进:从
let keys = Object.keys(globalObject); if (keys.length > 0) { keys.forEach(...) ...开始。 -
虽然这里的每个人都在疯狂追逐,但由于不是minimal reproducible example,我投票决定将此作为题外话结束。您有一个带有全局变量的程序,您承认在此函数运行和每个
database.query()回调之间会对其进行更新。如果没有进一步的信息,就不可能确切地告诉您是什么实际上导致了问题,我们只能猜测。请edit您的问题以尽可能少的代码重现此问题。 -
您是在回复电子邮件还是什么?我在发布后立即删除了该评论,因为我发现为时已晚。
-
您可能希望在代码中添加一个简单的控制台日志,以确保您了解正在发生的事情。除了将
keys捕获为自己的列表之外,还可以设置keys.forEach(key => { let data = globalObject[key]; console.log(processing 键${key} 和关联数据${JSON.stringify(data)});,这样您就可以看到您的代码将要尝试什么使用,然后在您的数据库回调中有一个类似的日志,以查看是否存在数据不匹配。打赌你的“全局对象”永远不应该是全局的,因为在你的查询运行时其他代码可能会弄乱它。
标签: javascript arrays node.js