2016-12-25 60 views
0

我使用discord.js來製作一個bot;主要功能運行良好,但我有一個循環遍歷一個對象;我從該對象獲取一些信息並將其發送到頻道;問題在於它爲每次迭代發送一條消息,並且它發送得太快;我試過使用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我想說的是,每次循環運行時,都會將消息發送到bot所在的通道;我只是不想獲得速率限制,因爲循環運行並立即發送消息;我說「保留信息」,如「保留消息,直到循環結束,然後將它們作爲1條消息發送」而不是6條單獨的消息。 – Dotdeb

回答

0

如果您只想通過循環發送一個包含所有迭代組合字符串的消息,那麼您可以在for循環中累積結果併發送一條包含組合字符串的消息。

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)); 

您可以自由選擇郵件中用於發送多個郵件的任何格式。我使用了JSON,因爲它很容易將一個數組變成單個字符串,然後在發送端使用JSON.stringify(),在接收端使用JSON.parse(),然後在另一端獲取數組。但是,如果您願意,可以使用逗號分隔的字符串。您只需從陣列中生成所需的格式,然後將格式解析爲另一端的多個消息。

+0

正是我需要的,謝謝! – Dotdeb