Добавьте ожидание между каждым оператором forEach - PullRequest
0 голосов
/ 22 марта 2019

Я хочу добавить время ожидания между каждым оператором forEach в приведенном ниже коде, я не хочу сталкиваться с проблемами с ограничениями скорости, поэтому я хочу ждать, скажем, 1 секунду, между каждым запуском forEach. Это возможно?

const Discord = require("discord.js");
const client = new Discord.Client();
const config = require("./config.json");

client.on("ready", () => {
  console.log(`Bot has started, with ${client.users.size} users, in ${client.channels.size} channels of ${client.guilds.size} guilds.`); 
});


client.on("message", async message => {

  if(message.author.bot) return;
  if(message.content.indexOf(config.prefix) !== 0) return;
 
  const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
  const command = args.shift().toLowerCase();
  
  
  if(command === "addalltorole") {
     
    process.setMaxListeners(n);



     
    let role = message.guild.roles.find(r => r.name == 'TribeVerified')
     
    if (!role) return message.channel.send(`**${message.author.username}**, role not found`)

    var hasRoles = ["449032040147582977", "489252560532799488", "449032406444277760", "449032567988158465", "449032704122552320", "449032907332255759", "449033048374247426", "449033186413117441", "459119831183130645", "449033329946394645", "462285271505829909", "528059697257775106", "462061656852398090", "461635407893889037", "535632204026609665", "535632207222407168535637767242121216", "535637767242121216", "535637777388142593", "542049404270673942"];
     


     message.guild.members.filter(member => member.roles.filter(r => hasRoles.includes(r.id)).size > 2).forEach(member => member.addRole(role));


	   message.channel.send(`**${message.author.username}**, role **${role.name}** was added to all applicable members`)

  }

});

client.login(config.token);

Я нашел это в stackoverflow в другом месте, не уверен, может ли оно быть полезным для реализации того, что я пытаюсь сделать?

var array = ['some', 'array', 'containing', 'words'];
var interval = 1000; // how much time should the delay between two iterations be (in milliseconds)?
array.forEach(function (el, index) {
  setTimeout(function () {
    console.log(el);
  }, index * interval);
});

Большое спасибо заранее за любую помощь!

1 Ответ

0 голосов
/ 22 марта 2019

Да, этот подход будет отлично работать.

Он будет разнесен на 1 секунду, независимо от того, сколько времени потребуется для их завершения.

... и это, вероятно, хорошо для того, что вы делаете ...


... но если вы хотите, вы можете использовать тот факт, что addRole возвращает Promise, чтобы сделать что-то классное.

Например, при этом используется reduce для передачи по Promises, так что каждый вызов ожидает завершения предыдущего вызова , а затем ждет дополнительную секунду, прежде чем сделать следующий запрос:

message.guild.members.filter(member => member.roles.filter(r => hasRoles.includes(r.id)).size > 2)
  .reduce(async (previous, member) => {
    await previous;  // wait for the previous call to finish
    await new Promise(resolve => setTimeout(resolve, 1000));  // wait another second
    return member.addRole(role);  // pass this Promise to the next iteration
  }, Promise.resolve());  // start with a resolved Promise

Вот рабочая демоверсия, которую вы можете запустить:

class Member {
  constructor(name) { this.name = name; }
  async addRole(role) {
    await new Promise(resolve => setTimeout(resolve, 100));  // simulate asynchronous call
    console.log(`added role "${role}" to ${this.name}`);
  }
}

const members = [
  new Member('first'),
  new Member('second'),
  new Member('third'),
  new Member('fourth'),
  new Member('fifth')
];

members.reduce(async (previous, member) => {
  await previous;
  await new Promise(resolve => setTimeout(resolve, 1000));
  return member.addRole('admin');
}, Promise.resolve());

... но да, любой из этих подходов сработает и вполне подойдет для того, что вы делаете.

...