В настоящее время я пытаюсь получить все сообщения в гильдии, но метод .fetchMessages
работает только на определенных каналах.
Я уже пытался использовать функцию .forEach
, но при этом получил несколько ошибок.
async function intervalFunc() {
var mainGuild = client.guilds.get("562324876330008576");
var messagesArray = [];
await mainGuild.channels.forEach(channel => {
if (channel.type == "text") {
channel.fetchMessages({ limit: 20 }).then(msg => {
messagesArray.push(msg);
});
}
});
console.log(messagesArray.length)
//....
}
Ожидаемый результат — не менее нескольких сотен, но вместо этого он выводит 0
.
Вы должны понимать, как работают промисы, прежде чем использовать async/await, иначе будет полная каша
Вам нужно поставить await
на асинхронную операцию:
async function intervalFunc() {
var mainGuild = client.guilds.get("562324876330008576");
var messagesArray = [];
for(channel in mainGuild.channels) {
if(channel.type == "text") {
const messages = await channel.fetchMessages({limit: 20});
messagesArray = [
...messagesArray,
...messages,
];
}
}
console.log(messagesArray.length);
}
Итак, здесь он будет ждать, пока ferchMessages
вернет значение асинхронным образом, а затем перейдет к следующей итерации.
Обратите внимание, что при этом messagesArray
будет содержать только подборки, а не все сообщения. Если вы хотите, чтобы он содержал сообщения, вам нужно заменить messagesArray.push(msg)
на messagesArray.push(...collection.array())
@FedericoGrandi Я согласен, что messagesArray
будет содержать вложенные массивы/коллекции, но мы не решаем эту проблему здесь. Фрагмент выше указывает на правильное использование await
и асинхронное сохранение ответов.
@Fawaz Код после forEach()
называется доchannel.fetchMessages()
возвращает что угодно. Поэтому messagesArray
будет пустым при использовании этого кода - проверено и подтверждено. См. это объяснение.
@slothiful Я понимаю вашу точку зрения, спасибо, что поправили меня. Я обновил свое решение.
Вы не можете ждать
forEach
, функцияforEach
возвращает значение undefined