我用javascript和node.js编写了这个脚本,它使用node.js进度和请求(https://github.com/request/request)包下载了一堆文件。 正在解雇多个请求。我的问题是关于变量的变量范围" bar"在on('响应',函数)中定义的" chunks"是该事件的本地和它内部的on(' data')事件/功能,或者多个get请求可能正在更新相同的进度条。我想我因为node.js和javascript的异步/事件驱动特性而感到困惑。
基本上这是代码:
var i;
var request = require('request').defaults({jar:true});
var ProgressBar = require('progress');
var fs = require('fs');
for (i in links){
var link = links[i];
request.get(link).on('response',function(response){
var disp = response.headers['content-disposition'];
var filename = disp.substring(disp.indexOf('filename="')+'filename="'.length,disp.length-1)
var chunks = [];
var len = parseInt(response.headers['content-length'], 10);
var bar = new ProgressBar(' downloading [:bar] :percent :etas', {total: len });
response.on('data',function(chunk){
bar.tick(chunk.length);
chunks.push(chunk);
});
response.on('end',function(){
console.log('writing file '+filename);
var file = new Buffer.concat(chunks);
f = fs.writeFileSync('/home/dolf/Documents/space_projecten/Elektor/'+filename,file)
});
});
}
答案 0 :(得分:3)
您已使用var来声明变量,并且您在响应事件中声明它们,因此每次触发事件时都会设置名为chunk
和bar
的新变量,因此它们是不更新相同的进度条,而是创建新的进度条。如果您想更新相同的进度条,则有两个选项,
声明变量而不使用var。
恩。 chunks = [];
或者
答案 1 :(得分:1)
这些变量是在函数内定义的,因此回调之间不会出现任何问题或共享。如果你想在回调之间共享一些东西,你应该在回调范围之外声明你的变量。