【问题标题】:discord.js .msg.channel.send().then promise not workingdiscord.js .message.channel.send().then 承诺不工作
【发布时间】: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 => 只是变成() =>

标签: promise discord.js bots loading


【解决方案1】:
  1. 不要全部使用“thens”
  2. 使用等待

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());
    

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2016-01-21
      相关资源
      最近更新 更多