如何按顺序解决承诺?

时间:2017-06-15 09:19:21

标签: javascript node.js

我有一个非常麻烦的时间来弄清楚如何按顺序做出承诺。我正在为Node.js中的DiscordApp制作一个聊天机器人,我在这里搜索了大量的搜索和Google。我尝试过使用Promise.all和Async函数。他们没有工作,但我觉得我做错了。

目前回到我开始使用我的代码的地方

let emoji = ['1⃣', '2⃣', '3⃣', '4⃣', '5⃣', '6⃣', '7⃣', '8⃣', '9⃣']

msg.channel.send('some message being sent')
  .then(sentMessage => {
    poll.users[msg.author.id].forEach(function(item, index) {
      sentMessage.react(emoji[index])
    })
  })

这有时会导致对消息的反应(如果不是大多数时候)混淆。正如你所看到的,表情符号是数字,所以我希望它们按顺序排列。由于.react()是一个承诺,他们随机解决,正如我之前所说,数字表情符号混淆了。如果我想让他们按顺序解决,我怎么能这样做?

我尝试过的事情:Promise.all

msg.channel.send('some message being sent')
  .then(sentMessage => {
    foo(poll, msg, sentMessage, index)
  })

async function foo(poll, msg, embedded, voteCount) {
  return await Promise.all(poll.users[msg.author.id].map(() => {
    embedded.react(nums[voteCount])
  }))
}

1 个答案:

答案 0 :(得分:4)

Maybe you want to try this:

msg.channel.send('some message being sent')
  .then(sentMessage => {
    const result = poll.users[msg.author.id].reduce((p, c, i) => p.then(() => sentMessage.react(emoji[i])), Promise.resolve());

    result.then(() => {
        console.log('all emojis shall be sent in order');
    });
})