javascript - 如何在等待 1 秒后发送不和谐消息

标签 javascript discord.js

if (msg.content.toLowerCase() === "!start") {
    var gov = setInterval(go, 1000);
    var onev = setInterval(one, 1000);
    var twov = setInterval(two, 1000);
    function two(msg) {
        msg.channel.send("https://i.imgur.com/JZOCg5l.png ");
    }
    function one(msg) {
        msg.channel.send("https://i.imgur.com/gTK3Vhn.png ");
    }
    function go(msg) {
        msg.channel.send("https://i.imgur.com/3iVfYIR.png ");
    }
    function two(msg) { }
    function one(msg) { }
    function go(msg) { }
    msg.channel.sendFile("https://i.imgur.com/kOoyoZQ.png ").then(onev).then(twov).then(gov);
}

这是一项非常烦人的任务。我需要大约一秒钟发送这些图像。
当前的框架不断给我以下错误:

C:\Users\maver\Documents\TestBot\testlev.js:197                                                                                  
msg.channel.sendFile("https://i.imgur.com/3iVfYIR.png ");                                                                
    ^                                                                                                                                                                                                                         
TypeError: Cannot read property 'channel' of undefined at Timeout.three [as _onTimeout] 
(C:\Users\maver\Documents\TestBot\testlev.js:197:17)                                
at ontimeout (timers.js:478:11)                                                                                      
at tryOnTimeout (timers.js:302:5)                                                                                    
at Timer.listOnTimeout (timers.js:262:5)   

我已经尝试了多种不同的方法,现在正准备认输。

最佳答案

你的语法有点不对劲。当您执行 functiontwo(msg){... 时,您实际上是在告诉函数您将向其传递一个新变量,并且您希望该变量名为 msg 。因此,msg(在函数的上下文中)是未定义的。当您从 setInterval() 调用该函数时,您必须传入 msg

有两种方法可以将 msg 绑定(bind)到您的函数。我个人喜欢的方式是这样的:

//...
var gov = setInterval(go.bind(null, msg), 1000);
var onev = setInterval(one.bind(null, msg), 1000);
var twov = setInterval(two.bind(null, msg), 1000);
//...

.bind() 函数分配参数的值。被调用函数的第一个参数是 bind() 的第二个参数。 bind() 的第一个参数应该用作函数内 this 的值。

另一种方法是使用匿名函数

//...
var gov = setInterval(function(){go(msg)}, 1000);
var onev = setInterval(function(){one(msg)}, 1000);
var twov = setInterval(function(){two(msg)}, 1000);
//...

另请注意,setInterval() 会每隔一段时间重复一次函数调用。您可能正在寻找 setTimeout() ,它只会在延迟后触发一次函数。

关于javascript - 如何在等待 1 秒后发送不和谐消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47252275/

相关文章:

javascript - 类型错误 : Cannot read property 'user' of null | discord. js

javascript - 无法读取未定义的属性(读取 'fetchBans' )

javascript - 如何修复必须使用导入来加载 ES 模块 discord.js

php - 图片上传以及jCrop和codeigniter

javascript - 用于制作论坛的文本到 HTML 转换器

javascript - Webview 无法在 android L 设备中加载 JavaScript Alert

node.js - discord.js 提取电子邮件

JavaScript,执行函数

javascript - 为 Javascript 类创建静态或类变量的现代方法

javascript - 两个 Node.JS 脚本读取/写入单个 .JSON 文件,但第一个脚本无法修改该文件