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)
我已尝试过多种不同的方式,我只是准备放弃。
答案 0 :(得分:1)
您的语法略有偏差。当你执行msg
时,你实际上在告诉函数你要传递一个新变量,并且你想要那个名为msg
的变量。因此,msg
(在您的函数的上下文中)是未定义的。当您从setInterval()
调用该函数时,您必须传入msg
。
有两种方法可以将//...
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()
重复一段时间的函数调用。您可能正在寻找import numpy as np
from sklearn.preprocessing import OneHotEncoder
wdict = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
dictarr = np.asarray(wdict.values()).reshape(-1, 1)
enc = OneHotEncoder()
enc.fit(dictarr)
enc.transform([[2]]).toarray()
,它只会在延迟后触发一次。
答案 1 :(得分:0)
当你使用setInterval时,你应该知道它将调用该函数,但不会向它提供任何参数(甚至this
)。修复它的一种方法是使用bind:
setInterval(go.bind(null, msg), 1000)
这样可行,因为bind()
将创建一个新功能,其中参数“预先神奇地设置”。
在这种情况下的另一个选择是不要在三个函数中重新声明msg
- 在这种情况下,javascript将尝试从外部作用域中找到msg:
function two() {
msg.channel.send("https://i.imgur.com/JZOCg5l.png ");
}
第三,你不应该使用setInterval,而应该使用setTimeout,它只会调用一次函数。
你遇到的第四个问题是时间问题。首先,所有三个setTimeout调用同时发生,因此所有三个函数将在一秒钟内调用(在1000毫秒之后)。一个简单的解决方法就是:
setTimeout(go, 1000);
setTimeout(one, 2000);
setTimeout(two, 3000);
但是,这将完全忽略发送每条消息所需的时间(可能是您想要的也可能不是)。如果您想在发送上一条消息后等待一秒钟,那么您必须执行以下操作:
msg.channel.sendFile("https://i.imgur.com/kOoyoZQ.png ").then(function() {
setTimeout(go, 1000);
});
function go() {
msg.channel.send("https://i.imgur.com/3iVfYIR.png").then(function() {
setTimeout(one, 1000);
});
}
// etc
这将非常繁琐,因为所有功能看起来都非常相似。因此,更好的方法是创建消息列表,然后使用单个函数发送所有消息:
var msgs = [
"https://i.imgur.com/kOoyoZQ.png",
"https://i.imgur.com/JZOCg5l.png",
"https://i.imgur.com/gTK3Vhn.png",
"https://i.imgur.com/3iVfYIR.png"
];
function sendMsgs(msgs, delay) {
if (msgs.length < 1) return; // we're done
var remain = msgs.slice(1);
var sendRemain = sendMsgs.bind(null, remain, delay);
msg.channel.send(msgs[0]).then(function() {
setTimeout(sendRemain, delay);
});
}
sendMsgs(msgs, 1000);
答案 2 :(得分:0)
您的代码会立即执行,因为您必须维护未正确使用的和未使用的值。 你可以这样做:
if (msg.content.toLowerCase() === "!start") {
var urls = ["https://i.imgur.com/kOoyoZQ.png",
"https://i.imgur.com/JZOCg5l.png",
"https://i.imgur.com/gTK3Vhn.png",
"https://i.imgur.com/3iVfYIR.png" ];
function gov(urls){
for(let k=0; k<urls.length;k++){
setTimeout(function() { msg.channel.send(k); },k*1000)
}
}
gov(urls);
}