问题描述
module.exports.run = (client,msg,args) => {
//...
//...
song_search.res.videos.forEach(async (song,i) => {
const songInfoER = await ytdl.getInfo(song.url).catch(err => {
const remove = song_search.res.videos.splice(i,1); //doesn't work here!
});
});
//...
//..
}
解决方法
您如何尝试这样做存在很多问题。最大的一个是.forEach()
不了解承诺,也不知道异步,因此.forEach()
循环运行到完成,然后过了一段时间,以无法预测的顺序,您的承诺就解决了,您尝试执行{{ 1}}操作。由于这些操作是按随机顺序进行的,因此不会有可预测的结果。此外,.splice()
循环完成后,song_search.res.videos
不会被更改。
有很多方法可以做到这一点。我建议一个常规的.forEach()
循环,该循环具有Promise和Async感知。由于要在迭代时从数组中删除项目,因此向后迭代数组也更容易,因此删除项目不会更改其余的迭代:
for