Foreach循环太快了

时间:2018-09-29 18:13:48

标签: javascript node.js discord.js

这是我正在使用的循环:

client.users.forEach(user => {
    if (user.presence.status == "online") {
        fnHistory.userUpdate(user.id, status, false, message);
    }
});

内部函数调用此:

client.channels.get("495635013073895429").fetchMessage("495636761926434818").then(message => {
    message.edit(`${message.content} \n \t - ${name}`);
});

我正在尝试使用新名称附加现有消息。但是在foreach循环之后,它仅显示姓氏。

这是在foreach ['foo','bar']中包含2个元素的方式:

  1. 在foreach之前:“当前跟踪:”
  2. 第一次迭代:接受“当前跟踪:”,并将其附加“-foo”
  3. 第二次迭代:采用“当前跟踪:”并将其附加“-条”。 (但是应该使用“当前跟踪:-foo”,然后将其附加“--bar”
  4. 完成方式类似于“当前跟踪:-条”

我进行了很多搜索,并且已经尝试使每个函数都使用一个Promise,但是foreach对此并不在意。我也尝试使用延迟/超时。 但是没有成功...

1 个答案:

答案 0 :(得分:1)

这可以通过多种方式来完成。但是在开始之前,您需要修改处理功能以返回promise

 function () {
    return client.channels.get("495635013073895429")
  .fetchMessage("495636761926434818").then(message => {
message.edit(`${message.content} \n \t - ${name}`);
    });
} 

然后,您可以使用reduce或编写async函数来序列化处理。

使用减少:

client.users.reduce((previousIteration, user => {
  if (user.presence.status === "online") {
    return previousIteration.then(() => fnHistory.userUpdate(user.id, status, false, message));
  }
  return previousIteration;
}, Promise.resolve());

使用异步功能:

async function updateOnlineUsers() {
  for (const user of client.users) {
    if (user.presence.status === "online") {
      await fnHistory.userUpdate(user.id, status, false, message));
    }
  } 
}