我正在创建一个队列,以在Node.js中下载YouTube视频。触发下载后,所有排队的视频应同时开始下载。只需从数据库中获取所有排队的视频并在for循环中对其进行迭代,即可轻松解决此问题。但是,下载完成后,我无法在数据库中对此进行标记,因为“视频”现在引用了我的for循环中的最后一个视频。我该如何解决?
...
var videos = db.videos.find({ status: 'queued' });
for (var video of videos) {
alert(video.id); // This is the correct id
var download = ytdl(`http://www.youtube.com/watch?v=${video.id}`);
download.pipe(fs.createWriteStream(filename));
download.on('end', () => {
video.status = 'done';
db.videos.update(video)
alert(video.id); // This is now the id of the last video in videos!
});
}
答案 0 :(得分:2)
var video
具有功能范围。您需要let video
或const video
,它们具有块范围。
或者,将循环的主体移至单独的函数将创建一个新的作用域,其中video
不能被覆盖:
for (var video of videos) {
downloadVideo(video)
}
function downloadVideo(video) {
// ... your download logic
}