【问题标题】:for...of loop halts for no apparent reasonfor...of 循环无故停止
【发布时间】:2017-12-23 10:01:18
【问题描述】:

我在 Discord 机器人上运行了以下 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 个元素以了解我在循环中所做的检查,并且它通过了所有这些检查。这可能是什么原因造成的?

【问题讨论】:

  • 可能是因为guilds中有93个元素。
  • 有超过 400 个。我忘了提到我什至检查了第 94 个元素以检查我在循环中所做的检查,它通过了所有检查。让我用这些细节编辑问题。
  • 如果您不使用guild 变量并想使用索引i,那么为什么不使用普通的for(let i = 0; ...)
  • 我并不真正需要索引,我只是添加了它以确保最后打印的元素实际上不是数组中的最后一个。不过,我将使用常规的 for 循环进行测试,也许它会起作用。
  • 不,同样的结果。

标签: javascript node.js discord


【解决方案1】:

如果循环退出比行

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

正在运行。

所以我猜你想继续循环,所以你应该使用 continue 退出该迭代,而不是 return

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2022-01-11
    • 2020-07-10
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多