我从这个网站上的其他地方撕下了一个很好的技巧,可以让你延迟循环的循环。我使用在TamperMonkey上运行的Javascript bot在Chrome版本34.0.1847.131 m中修改了一点我自己使用。
无论出于何种原因,一旦调用循环,就会开始发生MASSIVE内存泄漏(大约每秒40,000K-80,000K)并且它根本不循环。我的计算机已经崩溃了两次,因为我既没有准备也没有期待它。
//Tests if Bot is still connected
var connected = true;
function testConnection() { // create a loop function
setTimeout(function () { // call a 3s setTimeout when the loop is called
// your code here
randQuery = "PING " + Math.floor((Math.random()*8234)); //Creates a value of "PING " plus a random number attatched to the end to ensure that window.find only matches with the new ping
document.getElementById('msg').value = randQuery; //Inputs the above-created value into the message box
DoMessage(); //Submits what's in the message box. Fails if m.xat.com no longer has a connection to the chatroom.
var connected = window.find(randQuery); //If the above failed, randQuery will not be found, returning the value of "False". There's probably a better solution for this?
if (connected == true) {
sendMessage("succeeded"); //DEBUG
}
else {
sendMessage("failed"); //DEBUG
connected = false;
Reb00t(); //Reloads the page if DoMessage() failed
}
while (connected == true) { // if bot is still connected, call the loop function
testConnection(); // .. again which will trigger another
} // .. setTimeout()
}, 9000)
}
setTimeout( function startPingLoop() {
testConnection(); // start the loop
}
,1200);
我有什么东西搞砸了吗?我以前从未处理过内存泄漏。
答案 0 :(得分:3)
只要connected等于true,while循环就会一遍又一遍地闪烁,两者之间没有延迟。 while循环不是异步的 - 它会暂停脚本中的所有其他内容,直到它结束。
想象一个像自动代码编写器的循环。它编写的函数只要在括号中的语句为false之前就可以使用。
while (connected == true) {
testConnection();
}
相当于写作:
if (connected == true) {
testConnection();
}
if (connected == true) {
testConnection();
}
if (connected == true) {
testConnection();
}
if (connected == true) {
testConnection();
}
if (connected == true) {
testConnection();
}
if (connected == true) {
testConnection();
}
if (connected == true) {
testConnection();
}
if (connected == true) {
testConnection();
}
if (connected == true) {
testConnection();
}
...
只要connected等于true,就一遍又一遍地重复。因此,如果connected保持等于true,则while循环尝试编写无限长的代码,导致无限循环,直到testConnection()函数使连接等于false。如果你的计算机有无限的内存,这个无限长的代码会占用所有内存 - 但你的计算机没有无限的内存供应,所以它会崩溃。