Discord. js получение каждого списка пользователей для реакций - PullRequest
0 голосов
/ 27 января 2020

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

choices = {
        "?": "yes",
        "?": "No"
    }


    message.channel.fetchMessage(messageid ).then(r => {
        r.reactions.forEach(async (H) => {
            console.log(choices[H.emoji.name]);
            users = await H.fetchUsers();
            await  users.forEach(g => {
                    console.log(g.username);
                });

        });
       ```
but I am getting 
yes 
no 
bob 
Sarah
luke 
john  
when I am trying to get 
yes 
bob 
Sarah
luke 
No
john  




Ответы [ 2 ]

0 голосов
/ 28 января 2020

хорошо, посмотрев на ваш код, я застрял в реакциях [i] .emoji.name undefined emoji, но если я делаю код таким образом, он работает

        let reactions = r.reactions.array();
        let promises = [];
        reactions.forEach(re => {
            promises.push(re.fetchUsers());
        });

   let users = await Promise.all(promises);
        let i = 0;
        reactions.forEach(re => {
            console.log(choices[re.emoji.name]);
            users[i].forEach(u => console.log(u.username));
            i++;
        })
    });
0 голосов
/ 27 января 2020

То, что происходит, это ваш асин c forEach работает одновременно, ожидание в функции обратного вызова не останавливает l oop от перехода к следующей итерации. Вы можете даже увидеть немного разные результаты при каждом запуске. Регистрация имени Emoji идет довольно быстро, так что сначала он заканчивается в каждой итерации, а затем ожидает fetchUsers, в результате чего сначала да и нет.

Возможное решение - переместить вашу строку users = await H.fetchUsers(); до В верхней части кода l oop он даже не начнет выводить, пока не получит всю необходимую информацию. Вы также должны знать, что Collection.forEach не возвращает обещание, и поэтому ждать вашего users.forEach не нужно.

Однако это не гарантия заказа, поскольку список «Нет» может выводиться раньше, чем список «Да». Одним из способов гарантировать порядок будет полное удаление l oop и обработка каждого смайлика в коде после ожидания предыдущего. В качестве альтернативы вы можете получить пользователей в одном l oop, сохранить их в постоянной коллекции во время ожидания с Promise.all , а затем вывести их во втором l oop, повторяя сохраненные сохраненные имена.

message.channel.fetchMessage(messageid).then(r => {
   let reactions = r.reactions.array();
   let promises = [];
   reactions.forEach(re => {
        promises.push(re.fetchUsers());
   }

   let users = await Promise.all(promises);

   for(let i = 0; i = reactions.length; i++)
   {
        console.log(choices[reactions[i].emoji.name]);
        users[i].forEach(u => console.log(u));
   }
});
...