JS:在for循环中调用异步函数不会引用相同的迭代变量

时间:2019-06-19 22:55:38

标签: javascript node.js

我正在创建一个队列,以在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!
    });
}

1 个答案:

答案 0 :(得分:2)

var video具有功能范围。您需要let videoconst video,它们具有块范围。

或者,将循环的主体移至单独的函数将创建一个新的作用域,其中video不能被覆盖:

for (var video of videos) {
    downloadVideo(video)
}

function downloadVideo(video) {
    // ... your download logic
}