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/