因此,我想从特定渠道获取所有嵌入的消息,并在其说明中写上一个标签。
我首先使用channel.fetchMesssages()
提取嵌入式消息和简单消息并兑现了承诺。我得到了集合,可以将消息的值一对一地打印到控制台,但是不能将它们添加到对象中然后再将它们另存为JSON文件。
代码如下:
var news = client.channels.get('id')
var specialMessages = new Object()
news.fetchMessages()
.then(messages => {
messages.forEach((m, i) => {
specialMessages[m.content] = m.id
})
})
console.log(specialMessages)
fs.writeFileSync('messages.json', JSON.stringify(specialMessages, null, 2))
问题是我似乎没有向specialMessages
添加任何内容,因为它仅向控制台输出{}
。背后的魔力是什么?
答案 0 :(得分:4)
您应将console.log()
是在提取消息之前执行的,因为后者是异步操作并且没有立即完成(有关Promises 的信息)。< / p>
console.log(...)
和fs.writeFileSync(...)
行放在forEach()
循环之后,但应放在.then()
块的scope内。
答案 1 :(得分:0)
这应该有效
(async () => {
const news = client.channels.get('id');
const specialMessages = {};
const messages = await news.fetchMessages();
messages.forEach((m, i) => {
specialMessages[m.content] = m.id;
});
console.log(specialMessages);
fs.writeFileSync('messages.json', JSON.stringify(specialMessages, null, 2));
})();
答案 2 :(得分:0)
您的specialMessages是{},原因是文件未完成。文件完成后尝试console.log或使用异步回调。
var news = client.channels.get('id')
var specialMessages = new Object()
news.fetchMessages()
.then(messages => {
messages.forEach((m, i) => {
specialMessages[m.content] = m.id
})
})
fs.writeFileSync('messages.json', JSON.stringify(specialMessages, null, 2))
console.log(specialMessages)
答案 3 :(得分:-1)
使用.map()
。
var news = client.channels.get('id');
news.fetchMessages()
.then(messages => {
fs.writeFileSync('messages.json', JSON.stringify(messages.map(m => m.id), null, 2));
});