Я пытаюсь найти способ использовать циклы для получения старых сообщений о разногласиях, используя fetchMesasges() и до. Я хотел бы получить более 100 пределов, используя цикл, но я не могу понять это, и каждый пост, который я могу найти, только обсуждает, как использовать циклы для УДАЛЕНИЯ более 100 пределов, мне просто нужно их получить.
Я новичок в кодировании и, в частности, в javascript, поэтому я надеюсь, что кто-то может подтолкнуть меня в правильном направлении.
Вот единственный способ, которым мне удалось получить сообщения, которые находятся дальше 100 назад (после многих неудачных попыток использования циклов):
channel.fetchMessages({ limit: 100 })
.then(msg => {
let toBeArray = msg;
let firstLastPost = toBeArray.last().id;
receivedMessage.channel
.fetchMessages({ limit: 100, before: firstLastPost })
.then(msg => {
let secondToBeArray = msg;
let secondLastPost = secondToBeArray.last().id;
receivedMessage.channel
.fetchMessages({ limit: 100, before: secondLastPost })
.then(msg => {
let thirdArray = msg;
let thirdLastPost = thirdArray.last().id;
receivedMessage.channel
.fetchMessages({ limit: 100, before: thirdLastPost })
.then(msg => {
let fourthArray = msg;
});
});
});
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что вы можете сделать, так это использовать асинхронная/ожидающая функция и цикл для выполнения последовательных запросов.
async function lots_of_messages_getter(channel, limit = 500) {
const sum_messages = [];
let last_id;
while (true) {
const options = { limit: 100 };
if (last_id) {
options.before = last_id;
}
const messages = await channel.fetchMessages(options);
sum_messages.push(...messages.array());
last_id = messages.last().id;
if (messages.size != 100 || sum_messages >= limit) {
break;
}
}
return sum_messages;
}
Прочитайте документы для .concat();
@D.Overton Я обновил пример, чтобы использовать оператор спреда (sum_messages.push(...messages.array());)
@ Джейсон Я собираюсь прочитать документы, чтобы лучше с ним ознакомиться. Но я думаю, это именно то, что мне было нужно. Спасибо.
Я думаю, вам не хватает длины в последнем условии sum_messages.length >= limit
У меня это работает с использованием discord.js v 11.5.1 и TypeScript. Это обновленная версия сообщение Джейсона.
Причина, по которой я использовал это, заключается в следующем: максимальное ограничение DiscordAPI для получения сообщений составляет 100, а устаревший метод TextChannel#fetchMessages() больше не существует.
Я обновил его, чтобы использовать метод fetch(options?: ChannelLogsQueryOptions, cache?: boolean) объекта Текстовый канал#сообщения для получения коллекций из 100 или менее сообщений.
async function getMessages(channel: TextChannel, limit: number = 100): Promise<Message[]> {
let out: Message[] = []
if (limit <= 100) {
let messages: Collection < string, Message > = await channel.messages.fetch({ limit: limit })
out.push(...messages.array())
} else {
let rounds = (limit / 100) + (limit % 100 ? 1 : 0)
let last_id: string = ""
for (let x = 0; x < rounds; x++) {
const options: ChannelLogsQueryOptions = {
limit: 100
}
if (last_id.length > 0) {
options.before = last_id
}
const messages: Collection < string, Message > = await channel.messages.fetch(options)
out.push(...messages.array())
last_id = messages.array()[(messages.array().length - 1)].id
}
}
return out
}Я также немного обновил фрагмент, добавив возвращаемый тип функции и изменив его с общедоступного метода на статическую функцию.
это отлично сработало для меня. У меня все еще есть небольшие проблемы с повторением отдельных массивов, поскольку .push создает массив, содержащий отдельные массивы для каждых 100 полученных сообщений. Я пытаюсь найти способ заставить concat работать. В любом случае, спасибо за отзыв, он очень помог!