discord.js .message.channel.send().then 承诺不工作

Posted

技术标签:

【中文标题】discord.js .message.channel.send().then 承诺不工作【英文标题】:discord.js .msg.channel.send().then promise not working 【发布时间】:2021-05-01 12:46:06 【问题描述】:

这是我发送嵌入的代码,上面写着“正在加载商店,点会发生变化”。但是,我收到一条非常奇怪的错误消息,它首先告诉我错误在 msg.delete() 处,带有“UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'delete' of undefined”,然后在第二个 msg.edit () 说“无法读取未定义的属性‘编辑’”。我搜索了文档和许多论坛,但 .then() 语法应该是正确的。有什么想法吗?

var embed = new Discord.MessageEmbed().setColor("GOLD").setTitle("Loading shop");
    msg.channel.send(embed)
        .then(msg => setTimeout(()=>msg.edit(embed.setTitle("Loading shop.")), 500))
        .then(msg => setTimeout(()=>msg.edit(embed.setTitle("Loading shop..")), 500))
        .then(msg => setTimeout(()=>msg.edit(embed.setTitle("Loading shop...")), 500))
        .then(msg => setTimeout(()=>msg.edit(embed.setTitle("Loading shop")), 500))
        .then(msg => setTimeout(()=>msg.edit(embed.setTitle("Loading shop.")), 500))
        .then(msg => setTimeout(()=>msg.edit(embed.setTitle("Loading shop..")), 500))
        .then(msg => setTimeout(()=>msg.edit(embed.setTitle("Loading shop...")), 500))
        .then(msg => msg.delete());

【问题讨论】:

then 链接到下一个 then 及其返回值 - 所以你需要在每个 setTimeouts 之后 return msg 如果你想从闭包中获取msg,则不要使用msg 参数,因为它可能可用 - 所以msg => 只是变成() => 【参考方案1】:
    不要全部使用“thens” 使用等待

const embed = new Discord.MessageEmbed().setColor("GOLD").setTitle("Loading shop");
  const msg = message.channel.send(embed); // i change to message because msg will be used as var name
        setTimeout(() => 
      // do stuff
      msg.edit(embed.setTitle("Loading shop.")); // etc..
, 500);

【讨论】:

【参考方案2】:

解决问题如下。 setTimeout 没有得到很好的 promise 处理,所以我搜索了解决方案。

function delay(t, v) 
  return new Promise(function(resolve) 
    setTimeout(resolve.bind(null, v), t)
  );


Promise.prototype.delay = function(t) 
  return this.then(function(v) 
    return delay(t, v);
  );


var embed = new Discord.MessageEmbed().setColor("GOLD").setTitle("Loading shop");
msg.channel.send(embed)
  .delay(500).then(msg => msg.edit(embed.setTitle("Loading shop.")))
  .delay(500).then(msg => msg.edit(embed.setTitle("Loading shop..")))
  .delay(500).then(msg => msg.edit(embed.setTitle("Loading shop...")))
  .delay(500).then(msg => msg.delete());

【讨论】:

以上是关于discord.js .message.channel.send().then 承诺不工作的主要内容,如果未能解决你的问题,请参考以下文章

我将如何使用两个不同版本的 discord.js | Discord.js 机器人

Discord 错误错误 Discord.js 中的无效令牌

Discord 仅识别 discord.js 中的“ping”命令

错误“const Discord = require(discord.js) ^ ReferenceError: discord is not defined”

(Discord 机器人)当用户加入 Discord 服务器(discord.js)时,如何发送欢迎消息?

Discord.js 和 discord.js-commando 防止命令在特定通道中运行