javascript和node.js中多个请求之间的局部变量

时间:2014-12-10 10:37:31

标签: javascript node.js scope

我用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)
        });
    });
}

2 个答案:

答案 0 :(得分:3)

您已使用var来声明变量,并且您在响应事件中声明它们,因此每次触发事件时都会设置名为chunkbar的新变量,因此它们是更新相同的进度条,而是创建新的进度条。如果您想更新相同的进度条,则有两个选项,

  1. 声明变量而不使用var。 恩。 chunks = [];

    或者

  2. 在响应回调函数之外声明它们

答案 1 :(得分:1)

这些变量是在函数内定义的,因此回调之间不会出现任何问题或共享。如果你想在回调之间共享一些东西,你应该在回调范围之外声明你的变量。