Javascript 等一辆车开完
所以我尝试每4秒更新一次公会中每个频道的频道权限。它使用设置的超时进行更新,但是Javascript 等一辆车开完,javascript,discord.js,Javascript,Discord.js,所以我尝试每4秒更新一次公会中每个频道的频道权限。它使用设置的超时进行更新,但是msg.edit()在命令发送后立即进行编辑,而不是等待forEach()循环结束 我正在检查I是否等于通道计数(作为检查forEach()是否已结束的一种方法),但在更新所有通道之前对其进行编辑。既然i++设置了正确的超时时间(i*4000),并按照设置的时间间隔进行更新,为什么它在完成频道perms后不进行编辑 我记录了I和频道。大小channels.size返回为10,而i从1到10。 但是i在一瞬间从1到10
msg.edit()
在命令发送后立即进行编辑,而不是等待forEach()
循环结束
我正在检查I是否等于通道计数(作为检查forEach()
是否已结束的一种方法),但在更新所有通道之前对其进行编辑。既然i++
设置了正确的超时时间(i*4000
),并按照设置的时间间隔进行更新,为什么它在完成频道perms后不进行编辑
我记录了I
和频道。大小
channels.size
返回为10,而i
从1到10。
但是i
在一瞬间从1到10,而不是等待超时时间结束。我如何等待forEach的forEach
,然后编辑我发送的嵌入
msg=wait message.channel.send(更新)
设i=0
channels.forEach((channel)=>{
设置超时(()=>{
channel.updateOverwrite(更新,obj);
},i*4000)
我++
如果(i==channels.size){msg.edit(success)}
})
```
问题在于setTimeout()
将其回调安排在将来某个时候运行,但它是异步运行的,这意味着Javascript引擎不会等待这些调用发生,而是会立即执行以下代码。您需要能够安排代码在这些回调完成后运行,并且可以使用承诺来实现这一点
如下所示:
const通道=[{
updateOverwrite(){console.log('updateOverwrite 0')}
},
{
updateOverwrite(){console.log('updateOverwrite 1')},
},
];
const promises=channels.map((频道,索引)=>{
console.log('在地图中',索引);
返回新承诺((解决)=>{
设置超时(()=>{
channel.updateOverwrite();
解析(索引+已解析);
},指数*100);
});
});
承诺。所有(承诺)。然后(…结果)=>{
log(JSON.stringify(results));
console.log('msg.edit(success)');
});代码>不,它没有