Javascript 由于…的原因,循环停止,没有明显的原因
我在Discord bot上运行了以下Javascript 由于…的原因,循环停止,没有明显的原因,javascript,node.js,discord,Javascript,Node.js,Discord,我在Discord bot上运行了以下setInterval: client.setInterval(async () => { try { const response = await fetch('http://pso2.kaze.rip/eq/'); if (response.status !== 200) return; const data = await response.json(); const ca
setInterval
:
client.setInterval(async () => {
try {
const response = await fetch('http://pso2.kaze.rip/eq/');
if (response.status !== 200) return;
const data = await response.json();
const cache = JSON.parse(await fs.readFile("./cache.json"));
if (data[0]["time"] !== cache["time"]) {
const guilds = client.guilds.filter(guild => { return client.provider.get(guild, "alerts") });
let i = 0;
for (let guild of guilds) {
i = i + 1;
let settings = await client.provider.get(guild[1], "alerts");
let eqs = data[0]["eqs"].filter(item => { return settings["ships"].includes(item["ship"]) });
let format = [];
if (!client.channels.get(settings['channel'])) return;
let channel = client.channels.get(settings['channel']);
if (eqs.length <= 0) return;
if (eqs.length > 0 && eqs.length !== 10) {
for (let eq of eqs) {
format.push(`\`SHIP ${eq['ship']}:\` ${eq['name']} (${eq['jpName']})`);
}
}
else {
format.push(`\`ALL SHIPS:\` ${eqs[0]['name']} (${eqs[0]['jpName']})`);
}
let time = moment(data[0]["when"]);
let string = `:watch:**IN 40 MINUTES:** (${time.format("HH:mm")} JST)\n${format.join('\n')}`;
if (channel.type == "text" && channel.permissionsFor(client.user).has("SEND_MESSAGES")) {
//await client.channels.get(settings['channel']).send(string);
console.log(`${i} Sending alert to guild ${guild[1]}`);
}
else {
console.log(`${i} Skipping guild ${guild[1]}`);
}
}
console.log('writing file...');
await fs.writeFile("cache.json", `{ "time" : "${data[0]["time"]}" }`);
console.log('done');
}
} catch (err) {
console.error(err);
}
}, 10000, client);
client.setInterval(异步()=>{
试一试{
const response=等待获取('http://pso2.kaze.rip/eq/');
如果(response.status!==200)返回;
const data=wait response.json();
const cache=JSON.parse(等待fs.readFile(“./cache.JSON”);
如果(数据[0][“时间”!==缓存[“时间”]){
const guilds=client.guilds.filter(guild=>{return client.provider.get(guild,“alerts”)});
设i=0;
为了(让公会公会){
i=i+1;
let settings=wait client.provider.get(公会[1],“警报”);
设eqs=data[0][“eqs”].过滤器(项=>{return settings[“ships”].包括(项[“ship”]);
let format=[];
如果(!client.channels.get(settings['channel'])返回;
让channel=client.channels.get(设置['channel']);
if(eqs.length 0&&eqs.length!==10){
对于(让等式为等式){
format.push(`SHIP${eq['SHIP']}:\`${eq['name']}(${eq['jpName']})`);
}
}
否则{
format.push(`ALL SHIPS:\`${eqs[0]['name']}(${eqs[0]['jpName']})`);
}
让时间=时刻(数据[0][“当”]);
让string=`:watch:**在40分钟内:*(${time.format(“HH:mm”)}JST)\n${format.join('\n')}`;
if(channel.type==“text”&&channel.permissionsFor(client.user).has(“发送_消息”)){
//等待client.channels.get(设置['channel']).send(字符串);
log(`${i}向帮会${guild[1]}`发送警报);
}
否则{
log(`${i}跳过guild${guild[1]}`);
}
}
log('writing file…');
等待fs.writeFile(“cache.json”,“time”:“${data[0][“time”]}}”);
console.log('done');
}
}捕捉(错误){
控制台错误(err);
}
},10000,客户);
除了在第93次迭代后循环停止,并且没有执行任何其他操作(直到下一次迭代
setInterval
发生),所有操作都按预期进行。这很奇怪,因为guilds
数组中有400多个对象,我甚至在循环中检查了第94个元素,它通过了所有检查。什么原因可能导致这种情况?如果回路的出口大于线路的出口
if (!client.channels.get(settings['channel'])) return;
他正在跑步
所以我猜你想继续循环,所以你应该使用
continue
退出该迭代,而不是return
,如果循环退出的时间超过行
if (!client.channels.get(settings['channel'])) return;
他正在跑步
所以我猜你想继续循环,所以你应该使用
continue
退出该迭代,而不是return
,可能是因为行会中有93个元素,超过400个。我忘了提到我甚至检查了第94个元素在循环中的检查,它通过了所有检查。让我用这些细节来编辑这个问题。如果你不使用guild
变量,而是想使用indexi
,那么为什么不使用一个普通的for(让i=0;…)
?我其实并不需要索引,我只是添加了它以确保打印的最后一个元素实际上不是数组中的最后一个元素。不过,我将使用常规的for
循环进行测试,也许它会起作用。不,结果是一样的。可能是因为行业协会中有93个元素。有400多个。我忘了提到我甚至检查了第94个元素在循环中的检查,它通过了所有检查。让我用这些细节来编辑这个问题。如果你不使用guild
变量,而是想使用indexi
,那么为什么不使用一个普通的for(让i=0;…)
?我其实并不需要索引,我只是添加了它以确保打印的最后一个元素实际上不是数组中的最后一个元素。不过,我将使用常规的for
循环进行测试,也许它会起作用。不,相同的结果。