如何在延迟的情况下多次编辑同一条消息...?
这是我尝试过的...:
message.channel.send(`a`)
.then(message => {
setTimeout( () => {
message.edit(`ab`)
},1000);
})
.then(message => {
setTimeout( () => {
message.edit(`abc`)
},1000);
})
.then(message => {
setTimeout( () => {
message.edit(`abcd`)
},1000);
})
.then(message => {
setTimeout( () => {
message.edit(`abcde`)
},1000);
});
像这样应该可以工作,但如果我尝试这个错误是:当然Cannot read property 'edit' of undefined
(错误在“message.edit(abc
)”部分。)
答案 0 :(得分:1)
问题是第二个.then
传递给下一个.then
的值始终是前一个.then
的返回值
例如:
Promise.resolve('foo').then(value => {
console.log(value)
return 'abc'
}).then(console.log)
将拳头记录 foo
然后 abc
我能想到的最简单的解决方案是每次将 setTimeout
延迟增加 1000
message.channel.send('a').then(message => {
setTimeout(() => message.edit('ab'), 1000)
setTimeout(() => message.edit('abc'), 2000)
setTimeout(() => message.edit('abcd'), 3000)
setTimeout(() => message.edit('abcde'), 4000)
})
如果你想让它更通用,你可以这样做:
function changeMessage(delay, messages, message) {
for(i in messages) {
setTimeout(() => message.edit(messages[i]), delay * i)
}
}
message.channel.send('a').then(message => changeMessage(1000, ['ab', 'abc', 'abcd', 'abcde'], message))
函数 changeMessage
接受延迟时间、消息数组和您要编辑的实际消息对象,并且每隔 x 秒将消息编辑为消息数组中的每个新字符串>
这个问题有一个很好的语法解决方案,但如果你想顺序运行一堆 Promises,通常使用 async/await 会更容易