Javascript 使用节点js和循环从web下载文件

Javascript 使用节点js和循环从web下载文件,javascript,node.js,Javascript,Node.js,我想使用以下代码从web下载多个文件: var fs = require('fs'); var http = require('http'); var request = require('request'); var file; for(var i = 1; i <= 5; i++) { //CHECK IF REMOTE FILE EXISTS request('http://webaddress.com/f

我想使用以下代码从web下载多个文件:

    var fs = require('fs');
    var http = require('http');
    var request = require('request');

    var file;
    for(var i = 1; i <= 5; i++) {
         //CHECK IF REMOTE FILE EXISTS
         request('http://webaddress.com/filename' + i + '.jar', function (err, resp) {

         //IF EXISTS DO
         if (resp.statusCode == 200) {
             //DOWNLOAD DATA AND CREATE A NEW .JAR FILE
             file = fs.createWriteStream('D:\\filename' + i + '.jar');
             http.get('http://webaddress.com/filename' + i + '.jar', function(response) {
                  response.pipe(file);
                  file.on('finish', function() {
                      file.close();
                  });
             });
         }

         //FILE DOES NOT EXIST
         });
     }
var fs=require('fs');
var http=require('http');
var请求=要求(“请求”);
var文件;

对于(var i=1;i您的请求是异步的,它将仅在循环完成后执行,因此文件名中的
5
。解决方案是通过创建新函数并在循环内调用它来单独威胁代码:

var fs = require('fs');
var http = require('http');
var request = require('request');

var file;

function customRequest(i){

  //CHECK IF REMOTE FILE EXISTS
  return request('http://webaddress.com/filename' + i + '.jar', function(err, resp) {

    //IF EXISTS DO
    if (resp.statusCode == 200) {
      //DOWNLOAD DATA AND CREATE A NEW .JAR FILE
      file = fs.createWriteStream('D:\\filename' + i + '.jar');
      http.get('http://webaddress.com/filename' + i + '.jar', function(response) {
        response.pipe(file);
        file.on('finish', function() {
          file.close();
        });
      });
    }

    //FILE DOES NOT EXIST
  });

}

for (var i = 1; i <= 5; i++) {
   customRequest(i)
}
var fs=require('fs');
var http=require('http');
var请求=要求(“请求”);
var文件;
功能定制请求(一){
//检查远程文件是否存在
返回请求('http://webaddress.com/filename“+i+”.jar',函数(err,resp){
//如果存在,你会做什么
如果(响应状态代码==200){
//下载数据并创建一个新的.JAR文件
file=fs.createWriteStream('D:\\filename'+i+'.jar');
http.get('http://webaddress.com/filename“+i+”.jar',函数(响应){
管道(文件);
on('finish',function(){
file.close();
});
});
}
//文件不存在
});
}

对于(var i=1;iLike@Ionut说您的请求是异步的,所以您需要等待它

let fs = require('fs');
let request = require('request');

let download = (uri, filename) => {
    return new Promise ((resolve, reject) => {
        request.head(uri, function(err, res) {

            if (res.statusCode === 200) {
                request(uri).pipe(fs.createWriteStream(filename)).on('close', resolve);
            } else {
                reject(res.statusCode);
            }
        });
    });
};

let promises = [];

for(let i = 1; i <= 5; i++) {
    promises.push(download('http://webaddress.com/filename' + i + '.jar', 'D:\\filename' + i + '.jar'));
}

Promise.all(promises).then(() => {
    process.exit(0);
}); 
让fs=require('fs');
let request=require('request');
让下载=(uri,文件名)=>{
返回新承诺((解决、拒绝)=>{
head(uri,函数(err,res){
如果(res.statusCode==200){
请求(uri).pipe(fs.createWriteStream(filename)).on('close',resolve);
}否则{
拒绝(res.statusCode);
}
});
});
};
让承诺=[];
for(设i=1;i{
进程退出(0);
}); 

您的请求是异步的,只有在循环完成后才会执行,因此文件名中出现了
5
。我怀疑是这样。谢谢。我能做些什么来让它工作呢?看到这个答案,它可以帮您解决问题。谢谢@LucasDuarte,我会检查它。@lupu51nfactumN778,我已经为您添加了一个答案。谢谢,您的代码没有问题ke 5个独立的文件。我现在的问题是,所有数据只进入一个随机文件,其他文件是空的。这可能是函数执行太快了吗?我尝试了setTimeout,但运气不好。