即使处理完所有案件,承诺仍未解决

Posted

技术标签:

【中文标题】即使处理完所有案件,承诺仍未解决【英文标题】:Promise remains unresolved even after handling all cases 【发布时间】:2017-07-15 18:21:54 【问题描述】:

我已经在 Discord.JS Bot 上写了很长时间了,在执行其中一个聊天命令后,它似乎时不时地在控制台中向我抛出一个随机错误/警告 (特别是!clear)。

现在,正如我已经说过的,我在控制台中收到的消息是警告,而不是实际错误,所以这不是我遇到的主要问题;

我的问题在于 Discord 一方的命令执行:由于未解决、被拒绝的承诺,它根本不会执行 !clear,留下包括命令本身在内的所有消息。这是我的代码的 sn-p:

if (member.hasPermission("MANAGE_MESSAGES")) 
    channel.fetchMessages( limit: 100 )
        .then(messages => 
            console.log(`Deleting $messages.size messages...`);
            channel.bulkDelete(messages).then(res => , err => );
            channel.sendEmbed(
                // Success Message
            ).then(msg => msg.delete(10000), err => console.log(err));
        , err =>  console.log(err) )
 else 
    channel.sendEmbed(
        // Permission Message
    ).then(msg => msg.delete(10000), err =>  console.log(err) );

如你所见,我解决了每个 Promise 的 successfailure 状态,但我仍然会在控制台中看到以下警告:

(node:14768) 错误:错误请求 有时也会抛出 Not Found

-- 仅包含内部 Node.JS 错误的堆栈跟踪--

(node:14768) DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

-- 更多堆栈跟踪与我自己的任何代码无关--

如果你们中的任何人需要提供额外的代码来回答问题,请随时问我,我会这样做。另外,我还不能 +rep 回答,但我总是很感激他们 :)

【问题讨论】:

除了直接的问题,channel.sendEmbed(/*Success Message*/) 独立于channel.bulkDelete(messages),因此成功消息不是成功的可靠指标。这很容易通过链接channel.bulkDelete(messages).then(() => channel.sendEmbed(...).then(...)) 来解决。 【参考方案1】:

您没有处理 msg.delete(10000) 拒绝。你应该这样处理它:

channel.sendEmbed(
  // Success Message
).then(msg => msg.delete(10000)).catch(err => console.log(err));

【讨论】:

@Maxx2709 我建议不要使用承诺的.then(success, failure) 的第二个参数,而只使用.then(success).catch(failure)

以上是关于即使处理完所有案件,承诺仍未解决的主要内容,如果未能解决你的问题,请参考以下文章

等待所有承诺解决

等待所有承诺解决

回调解决未处理的承诺,为啥?

如何解决未处理的承诺拒绝?

未处理的承诺警告。如何解决?

如何解决该错误>> WARN可能的未处理承诺拒绝(id:0):