Node.js - 循环使用http.get本地保存的JSON文件列表

时间:2016-10-18 10:23:07

标签: javascript json node.js http

我有一个JSON文件,其中包含服务器上的文件名列表。我需要遍历此列表并在本地保存每个文件。我有这个工作到一定程度。有时候它会像魅力一样,有些则没有,我最终会得到空文件。

我知道这可能是在上一个文件完成之前开始下载下一个文件但是我正在努力重新编写这个文件以便在文件完成后开始下载下一个文件。我对客户端编码没有经验,所以非常感谢对此有所帮助。

var filefolder = 'http://www.example.com/files/';
        var newdir = nw.App.dataPath;
        $.each(jsonFiles, function(i, fn) {
            //read and download to save locally
            var filelink = filefolder + '/' + fn;
            var newfile = fs.createWriteStream(newdir+'/files/' + '/' + fn);
            var request = http.get(filelink, function(response) {
                response.pipe(newfile );
                console.log(fn);
                newfile.on('finish', function() {
                    newfile.close(cb);
                });
            });
        });

1 个答案:

答案 0 :(得分:1)

由于您的下载代码位于each循环内且http.get是异步的,因此您必须使用闭包来包装该调用。

像这样,

var filefolder = 'http://www.example.com/files/';
var newdir = nw.App.dataPath;
$.each(jsonFiles, function(i, fn) {
    //read and download to save locally
    var filelink = filefolder + '/' + fn;
    var newfile = fs.createWriteStream(newdir + '/files/' + '/' + fn);
   (function(filelink, newfile, fn, cb) {
       var request = http.get(filelink, function(response) {
                 response.pipe(newfile);
                 console.log(fn);
                 newfile.on('finish', function() {
                     newfile.close(cb);
                 });
             });
   })(filelink, newfile, fn, cb)
});