2017-11-12 6 views
0
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); 
} 

これは非常に面倒な作業です。私は約1秒のappartこれらのイメージを送信する必要があります。
現在の枠組みは私に次のエラーを与え続け:1秒待ってから不一致メッセージを送信する方法

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) 

私はこれに多数の異なる方法を試してみましたが、ちょうど約準備ができてタオルでスローするようにしていました。

答えて

1

構文は少しオフです。 function two(msg){...を実行すると、実際に関数に新しい変数を渡すことを伝えており、その変数をmsgとしたいとします。そのため、msg(あなたの関数の文脈で)は未定義です。関数をsetInterval()から呼び出すときは、msgを渡す必要があります。

msgを機能にバインドするには2通りの方法があります。私は個人的に好きな方法がこれです:

//... 
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()の2番目の引数です。 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()を探しているかもしれません。

+0

ありがとうございます!ボットは、必要に応じて画像を送信します。残念ながら、10000ミリ秒の遅延があっても、画像はお互いの直後(最初の画像を除く)に残っています。私はそれを修正することができますか? –

0

setIntervalを使用すると、関数が呼び出されることはわかりますが、パラメータは提供されません(またはthis)。それを修正する一つの方法は、バインドを使用して次のようになります。

setInterval(go.bind(null, msg), 1000) 

これはうまくいく、bind()は、パラメータは「魔法あらかじめ設定」されている新しい関数を作成しますので。

この場合、別のオプションは、単に三つの機能でmsgを再宣言しないことであろう - その場合には、ジャバスクリプトが存在する外側のスコープからMSGを見つけようとします:

function two() { 
    msg.channel.send("https://i.imgur.com/JZOCg5l.png "); 
} 

サードをsetIntervalではなく、setTimeoutを使用してください。setTimeoutは、関数を1回だけ呼び出します。

4番目の問題はタイミングです。まず、3つのsetTimeout呼び出しがすべて同時に発生するため、3つの関数はすべて1秒間に呼び出されます(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 

:あなたは前のメッセージが送信された後の第2の待つしたい場合は、のような何かをする必要があると思います。だから、より良いアプローチは、それらのすべてを送信するために、単一の機能を持って、その後、メッセージのリストを作成することです:あなたが使用している値のANFの約束を維持する必要があるため

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); 
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); 
    } 
関連する問題