2016-12-25 8 views
0

私はbotordを作成するためにdiscord.jsを使用しています。主な機能はうまく動作していますが、私はオブジェクトを繰り返し処理するforループを持っています。私はそのオブジェクトからいくつかの情報を得て、それをチャンネルに送ります。それは、各反復のためにメッセージを送信し、それらをあまりにも速く送信することです。私はsetInterval()を使用しようとしましたが、動作しません。より良い解決策は、送信前にその情報をどこかに保持したい場合です。これは私のコードです:送信前にループ情報を保持する

var stat = [] 
var statNames = ['Speed', 'Special Defense', 'Special Attack', 'Defense', 
       'Attack', 'HP'] 


for(x in response.stats) { 

    stat = {"base": response.stats[x].base_stat, 
      "effort": response.stats[x].effort} 

    msg.channel.sendMessage(statNames[x] + ": " + stat.base + " - EV: " + stat.effort) 
} 

私はループのmsg.channel.sendMessage外に置く場合は、メッセージが正しく送信されず、スティルがメッセージを1つに送信します。私はちょうど1つのメッセージとしてそれらを送信したいです。それは6回実行されるので、あまりにも速く送信されている6つのメッセージがあり、これによってレートが制限されることがあります。

+0

「送信前の情報を保持する」とはどういう意味ですか?あなたが望むなら、あなたの 'for'ループにオブジェクトの配列を簡単に作ることができますが、あなたの望む出力がここにあるのか分かりません。 – jfriend00

+0

@ jfriend00私が言うことは、ループが実行されるたびにボットがあるチャネルにメッセージを送信するということです。私はちょうどループを実行し、それはすぐにメッセージを送信するため、レートを制限することを望んでいません。私は、 "ループが終わるまでメッセージを保持してから、1つのメッセージとして送信する"のように、6つの別々のメッセージではなく、 "情報を保持する"と言った。 – Dotdeb

答えて

0

ループを介してすべての反復の結合された文字列で1つのメッセージを送信する場合は、結果をforループに蓄積し、結合された文字列で1つのメッセージを送信します。

var accumulatedResults = []; 
for (x in response.stats) { 
    // push string into the array to accumulate it 
    accumulatedResults.push(statNames[x] + ": " + response.stats[x].base_stat + " - EV: " + response.stats[x].effort); 
} 
// Now convert the array to JSON and send it all in one message 
// The receiving side can use JSON.parse() to turn it back into an array 
msg.channel.sendMessage(JSON.stringify(accumulatedResults)); 

1つのメッセージで複数のアイテムを送信する場合は、メッセージ内の任意のフォーマットを自由に選択できます。私はJSONを使いました。なぜなら、配列を取ってそれを単一の文字列に変換して送信し、もう一方の端で配列を返すのは、JSON.stringify()を送信側に、JSON.parse()を受信側に使用することです。しかし、必要であればコンマで区切った文字列を使用できます。一方の端で配列から目的のフォーマットを生成し、もう一方の端で複数のメッセージにフォーマットを解析し直すだけです。

+0

まさに私が必要なもの、ありがとう! – Dotdeb

関連する問題