我的捕捉块(async)似乎是随机调用的

问题描述 投票:0回答:1

我在使用async await的部分代码中遇到了一个非常奇怪的问题。这是使用 Discord.js库。

基本上,在我的服务器上有一个向新人提问的discord机器人,代码有点长,所以我只是把我有问题的部分贴出来。

问题是在DM中提问回答的。我使用的是 awaitMessages 函数,这是Discord.js所特有的。但是在这段代码中,即使计时器没有超过最大消息量,catch函数有时也会被随机调用。

这就像catch被立即调用,我不知道为什么,因为正如我所说,它似乎是随机的。

我在机器人提出的15%的问题上遇到了这个问题,对于所有其他的问题,代码进入了 awaitMessages函数的.then块,而不是 catch。

知道是什么原因导致的吗?我真的不知道这个问题是由Discord.js引起的,还是我在JavaScript逻辑中遗漏了什么。我已经在官方Discord.js的discord服务器上问过我的问题,但没有成功。

        // send the question
        await newmsg.channel.send(questions[i]);

        // wait for the answer
        await newmsg.channel.awaitMessages(m => m.author.id === user.id, { max: 1, time: 300000, errors: ["time"], })
        .then(collected => {
          // answer given by member. The var "collected" contains the messages collected. We use .first to get the answer given

          // if questions are not canceled and the answer given is false, we stop
          if(!cancel && !checkAnswer(i, collected.first()))
          {
               badAnswer = true;
               return;
          }

        }).catch(async () => {
          await user.send(":hourglass: **End of time**";
          removeUserFromApplicants(user.id);
          cancel = true;
                    isCanceled = true;
          //console.log(`${user.username} let their application time out.`);
          logMonitoring(":clock1: Time over for **" + user.username + "**.");
        });
javascript asynchronous async-await try-catch discord
1个回答
0
投票

try {
  await newmsg.channel.send(questions[i]); 
// wait for the answer 
  let collected = await newmsg.channel.awaitMessages(m => m.author.id === user.id, { max: 1, time: 300000, errors: ["time"], }) 
 if(!cancel && !checkAnswer(i, collected.first()))  { 
  badAnswer = true; return;
 }
} catch(error){
 await user.send(":hourglass: **End of time**"; removeUserFromApplicants(user.id); cancel = true; isCanceled = true; 
 logMonitoring(":clock1: Time over for **" + user.username + "**."); 
}

0
投票

经过几个小时的搜索,我很遗憾地没有找到这两个块被调用的确切原因。我高度怀疑是 max: 1 导致所有这些无意义的事情。

所以我所做的是用一个 while 循环包围整个 Promise。我去掉了捕获块的 "最大时间 "功能,换句话说我清空了捕获块。我所做的是,只要catch块被调用,我们就会重新启动 "等待过程",直到机器人真的在等待消息。

如果我发现更多信息,我会更新。这个解决方案并不完美,但目前效果不错。

© www.soinside.com 2019 - 2024. All rights reserved.