discord.js .msg.channel.send().then promise 不起作用

discord.js .msg.channel.send().then promise not working

所以这是我发送嵌入的代码,上面写着 Loading shop with the dots changing。但是,我收到一条非常奇怪的错误消息,它首先告诉我错误在 msg.delete() 处,带有“UnhandledPromiseRejectionWarning: TypeError: Cannot read 属性 'delete' of undefined”,然后是第二个 msg.edit() 说“无法读取未定义的 属性 '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()});
  1. “然后”不要使用这一切
  2. 使用 await

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

解决问题如下。 setTimeout 没有很好地处理承诺,所以我搜索了解决方案。

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