Search code examples
promisediscord.jsbotsloading

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


So this is my code for sending an embed, that says Loading shop with the dots changing. However, I am getting a pretty strange error message, which first tells me the error is at msg.delete() with "UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'delete' of undefined" and then a second one at the second msg.edit() saying "Cannot read property 'edit' of undefined". I searched up the docs and many forums, but the .then() syntax should be right. Any idea?

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

Solution

  • Solved the problem as follows. The setTimeout is not getting handled well with promises so I searched up the solution.

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