Javascript 等一辆车开完

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

所以我尝试每4秒更新一次公会中每个频道的频道权限。它使用设置的超时进行更新,但是
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)');

});不,它没有