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

local variables between multiple requests in javascript and node.js

本文关键字:请求 之间 局部变量 node js JavaScript      更新时间:2023-09-26

我用javascript和node编写了这个脚本.js它使用node.js进度和请求(https://github.com/request/request)包下载了一堆文件。正在触发多个请求。我的问题是,on('response',函数)中定义的变量"bar"和"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)
        });
    });
}

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

  1. 声明变量而不在其中使用 var。前任。 chunks = [];

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

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