Да, этот подход будет отлично работать.
Он будет разнесен на 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());
... но да, любой из этих подходов сработает и вполне подойдет для того, что вы делаете.