我收到了内存泄漏,我不明白为什么。它是基于我之前制作的可以正常工作的脚本。我所做的就是更改变量的名称并更改一个值。
这是给我内存泄漏的代码。
console.log("Mine plugin started.")
var mineflayer = require('mineflayer');
var vec3 = mineflayer.vec3;
module.exports.inject = inject;
function inject(bot) {
var Mine = false
bot.on('whisper', function (username, message) {
if (username == bot.username) return;
if (message == 'mine') {
Mine = true
gotoBlo()
}
if (message == 'stop') {
Mine = false
}
});
function gotoBlo() {
if (Mine = true) {
posBlo = bot.entity.position;
blockBlo = findBlock('diamond_ore', 8, posBlo);
if (blockBlo != null) {
var tempVar = vec3(blockBlo.position.x, blockBlo.position.y, blockBlo.position.z);
bot.scaffold.to(tempVar)
setTimeout(gotoBlo,5000)
}
}
}
function findBlock(type, size, point) {
var block = null;
var shortest = null;
var x1 = Math.floor(point.x - size);
var x2 = Math.floor(point.x + size);
var y1 = Math.floor(point.y - size);
var y2 = Math.floor(point.y + size);
var z1 = Math.floor(point.z - size);
var z2 = Math.floor(point.z + size);
//bot.chat(x1 + "");
for (x = x1; x < x2; x++) {
for (y = y1; y < y2; y++) {
for (z = z1; z < z2; z++) {
var cPoint = vec3(x, y, z);
var cBlock = bot.blockAt(cPoint);
//bot.chat(cPoint + "");
if (cBlock) {
//bot.chat(cBlock.name);
if (cBlock.name == type) {
if ((shortest > cPoint.distanceTo(point)) || shortest == null) {
shortest = cPoint.distanceTo(point);
block = cBlock;
}
}
}
}
}
}
return block;
}
}
这里的代码运行正常。
console.log("Defuse plugin started.")
var mineflayer = require('mineflayer');
var vec3 = mineflayer.vec3;
module.exports.inject = inject;
function inject(bot) {
var Disarm = false
bot.on('whisper', function (username, message) {
if (username == bot.username) return;
if (message == 'defuse') {
disarm = true
gotoTNT()
}
if (message == 'stop') {
disarm = false
}
});
function gotoTNT() {
if (disarm = true) {
posTNT = bot.entity.position;
blockTNT = findBlock('tnt', 32, posTNT);
if (blockTNT != null) {
var tempVar = vec3(blockTNT.position.x, blockTNT.position.y, blockTNT.position.z);
bot.scaffold.to(tempVar)
setTimeout(gotoTNT,5000)
}
}
}
function findBlock(type, size, point) {
var block = null;
var shortest = null;
var x1 = Math.floor(point.x - size);
var x2 = Math.floor(point.x + size);
var y1 = Math.floor(point.y - size);
var y2 = Math.floor(point.y + size);
var z1 = Math.floor(point.z - size);
var z2 = Math.floor(point.z + size);
//bot.chat(x1 + "");
for (x = x1; x < x2; x++) {
for (y = y1; y < y2; y++) {
for (z = z1; z < z2; z++) {
var cPoint = vec3(x, y, z);
var cBlock = bot.blockAt(cPoint);
//bot.chat(cPoint + "");
if (cBlock) {
//bot.chat(cBlock.name);
if (cBlock.name == type) {
if ((shortest > cPoint.distanceTo(point)) || shortest == null) {
shortest = cPoint.distanceTo(point);
block = cBlock;
}
}
}
}
}
}
return block;
}
}
答案 0 :(得分:1)
基于your screen shot,它看起来好像超过了eventEmitter
上的默认maxListener计数,因此它给了你一个警告,表明这可能是一个错误(它无法知道它是否是是一个真正的错误)。如果这是预期的行为,您可以使用setMaxListeners()
提升最大限额,如下所示。
以下是EventEmitter
对象node.js doc的引用。
emitter.setMaxListeners(n)的
默认情况下,如果超过10,EventEmitters将打印警告 为特定事件添加了侦听器。这是一个有用的默认值 这有助于发现内存泄漏。显然不是所有的发射器都应该 限制为10.此功能允许增加。调成 无穷大(或0)无限制。
返回发射器,因此可以链接调用。
由于您在问题中包含的特定代码并未直接添加任何事件侦听器,因此我们很难知道您的代码是否在执行某些操作,而不应该在此处执行。我看到的唯一可能值得调查的代码是bot.scaffold.to(...)
,以查看bot
对象中的内容。
正如我在评论中提到的,还有其他一些编码错误:
你声明:
var Disarm = false
然后,你设置:
disarm = true
这两个变量应该是相同的情况。
此:
if (disarm = true)
应改为:
if (disarm == true)
甚至更简单,只是:
if (disarm)
if (disarm = true)
将分配disarm = true
,然后评估始终为true
的结果,以便if
语句永远不会做有用的事情。您使用==
或===
检查条件是否相等,而不是=
。
然后,您的变量x
,y
和z
需要在使用之前用var x, y, z
声明,因此它们是正确的局部变量,而不是隐式全局变量。
仅供参考,您可以将代码粘贴到http://jshint.com/,以获取有关您可能犯错误的建议。