等待1秒后如何发送不和谐信息

时间:2017-11-12 18:18:12

标签: 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)   

我已尝试过多种不同的方式,我只是准备放弃。

3 个答案:

答案 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);
    }