2017-07-18 2 views
0

ich habe folgende setInterval auf einem Discord Bot laufe:für ... die Schleife stoppt ohne ersichtlichen Grund

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); 

Alles ist wie erwartet funktioniert, außer dass nach der 93. Iteration der Schleife stoppt und nichts anderes wird ausgeführt (bis die nächste Iteration der setInterval passiert). Das ist seltsam, weil das Array guilds über 400 Objekte enthält, und ich habe sogar das 94. Element für die Prüfungen überprüft, die ich innerhalb der Schleife mache, und alle bestanden. Was könnte das verursachen?

+1

Vielleicht, weil es 93 Elemente in 'guilds' ist. –

+0

Es gibt über 400. Ich vergaß zu erwähnen, dass ich sogar das 94. Element für die Kontrollen, die ich in der Schleife mache, überprüft habe und es alle bestanden hat. Lassen Sie mich die Frage mit diesen Details bearbeiten. –

+0

Wenn Sie nicht die 'Gilden' Variable benutzen und stattdessen den Index' i' verwenden wollen, warum benutzen Sie dann nicht ein normales 'for (let i = 0; ...)'? –

Antwort

4

Wenn die Schleifen-Exits als die Linie

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

läuft.

Also auf Looping so sollten Sie ich bin zu raten Sie continue werden behalten wollen mit dieser Iteration zu beenden, nicht return

Verwandte Themen