Получение сообщений по нескольким каналам

В настоящее время я пытаюсь получить все сообщения в гильдии, но метод .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.

Вы не можете ждать forEach, функция forEach возвращает значение undefined

Cristian Traìna 22.05.2019 15:28

Вы должны понимать, как работают промисы, прежде чем использовать async/await, иначе будет полная каша

Cristian Traìna 22.05.2019 15:28
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
2
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно поставить 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())

Federico Grandi 22.05.2019 16:56

@FedericoGrandi Я согласен, что messagesArray будет содержать вложенные массивы/коллекции, но мы не решаем эту проблему здесь. Фрагмент выше указывает на правильное использование await и асинхронное сохранение ответов.

Fawaz 22.05.2019 23:54

@Fawaz Код после forEach() называется доchannel.fetchMessages() возвращает что угодно. Поэтому messagesArray будет пустым при использовании этого кода - проверено и подтверждено. См. это объяснение.

slothiful 23.05.2019 00:10

@slothiful Я понимаю вашу точку зрения, спасибо, что поправили меня. Я обновил свое решение.

Fawaz 23.05.2019 02:41

Другие вопросы по теме