我正在尝试创建一个脚本,从 API 获取消息,然后过滤掉包含图像的消息。 API 有不同的端点,每个端点都有自己的一批消息。我只是想收集所有这些。在此示例中,有 3 个链接,这就是它三次注销“test”的原因。
我的问题是在调用broadcast()函数之前messageGetter()函数没有完全完成循环。因此,现在当我第一次执行脚本时,它会广播一个空数组,但在第二次执行时,它会包含我需要的内容。
我该如何解决这个问题?
module.exports = {
async execute(app) {
await fetchImages(app);
await interaction.reply("Getting Images");
},
};
async function fetchImages(app) {
app.link.forEach(async (link) => {
if (link.type === 0) {
await messageGetter(link);
}
});
console.log("here");
broadcast({ type: "imageLinks", data: imageLinks });
imageLinks.splice(0, imageLinks.length);
}
async function messageGetter(link, limit = 500) {
const sum_messages = [];
let last_id;
while (true) {
const options = { limit: 100 };
if (last_id) {
options.before = last_id;
}
const messages = await link.messages.fetch(options);
sum_messages.push(...messages.values());
last_id = messages.last().id;
if (messages.size != 100 || sum_messages >= limit) {
break;
}
}
sum_messages.forEach((message) => {
if (message.attachments.size > 0) {
message.attachments.forEach((attachment) => {
if (attachment.url.match(/\.(jpeg|jpg|gif|png)$/i)) {
imageLinks.push(attachment.url);
}
});
}
});
console.log("test");
}
日志输出:
here
test
test
test
你的问题就在这里
app.link.forEach(async (link) => {
if (link.type === 0) {
await messageGetter(link);
}
});
因为 forEach 不会等待 messageGetter() 函数的执行,所以您可以使用 for-of 循环来按您想要的方式工作。示例:
async function fetchImages(app) {
for(const link of app.link) {
if (link.type === 0) {
await messageGetter(link);
}
}
console.log("here");
broadcast({ type: "imageLinks", data: imageLinks });
imageLinks.splice(0, imageLinks.length);
}