2017-07-18 122 views
0

我有一个不和谐机器人运行以下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); 

一切工作正常,除了第93迭代循环停止,没有别的后被执行(直到发生setInterval的下一次迭代)。这很奇怪,因为guilds数组中有超过400个对象,我甚至在第94个元素中检查了我在循环内进行的检查,并通过了所有这些元素。什么可能导致这个?

+1

也许因为在'guilds' 93元。 –

+0

有超过400个。我忘了提及,我甚至检查了第94个元素,检查了我在循环中进行的检查,结果全部通过了。让我用这些细节来编辑问题。 –

+0

如果你没有使用'guild'变量,而想使用索引'i',那么为什么不用一个普通的'for(let i = 0; ...)'? –

回答

4

如果循环退出比线

if (!client.channels.get(settings['channel'])) return; 

运行。

所以我猜你想保持循环,所以你应该使用continue退出该迭代,不return