Node.js异步文件写入(svg2img)

时间:2018-12-04 12:31:59

标签: javascript node.js

我在svg2img代码块内写入文件时遇到问题。 这是代码:

SELECT [DISTRICTS].ID, [DISTRICTS].NAME FROM DISTRICTS ORDER BY [NAME];

我的问题是,以这种方式,svg2img函数仅写入一个名为SELECT [DISTRICTS].NAME FROM Facilities INNER JOIN DISTRICTS ON Facilities.DISTRICT_OLD = [DISTRICTS].ID; 的文件(10次),而没有写入文件INSERT INTO Facilities(DISTRICT)直到for(var i = 0; i < frames.length; i++){ svg = barChartHelper.getBarChart({ data: frames[i], width: 400, height: 300, xAxisLabel: '2012', yAxisLabel: 'Views', containerId: 'bar-chart-small' }) console.log(i) svg2img(svg, function(error, buffer) { console.log("try to write file " + i); fs.writeFileSync('foo'+i+'.png', buffer, function(er){console.log(er)}); }); console.log(svg) fs.writeFile('frames/plot'+i+'.svg', svg, (er)=> console.log(er)); } 。 frame.length为10。

我猜svg2img函数将被异步处理,因此它将在循环中的其他函数之后执行。在svg2img()函数内部,我也尝试了Async变体,但没有区别。

如何使用不同的数据(帧[i])将文件foo0.png写入foo9.png?

3 个答案:

答案 0 :(得分:1)

使用let代替var,让块作用域范围内的问题可能会解决,

for(let i = 0; i < frames.length; i++){
    svg = barChartHelper.getBarChart({
      data: frames[i],
      width: 400,
      height: 300,
      xAxisLabel: '2012',
      yAxisLabel: 'Views',
      containerId: 'bar-chart-small'
    })
    console.log(i)
    svg2img(svg, function(error, buffer) {
      console.log("try to write file " + i);
      fs.writeFileSync('foo'+i+'.png', buffer, function(er){console.log(er)});
    });
    console.log(svg)
    fs.writeFile('frames/plot'+i+'.svg', svg, (er)=> console.log(er));
}

答案 1 :(得分:0)

我这样解决了:

remove: function(index) {
    this.data = this.data.splice(index, 1);
}

但是我仍然不明白为什么或如何产生了影响。学习时间。非常感谢。

答案 2 :(得分:0)

逐步解释发生了什么,以及为什么实际行为与预期不同:

1的for循环(i = 0)迭代: svg2img使用svg并委托将其转换为另一个进程

2的for循环(i = 1)迭代: svg2img使用svg并委托将其转换为另一个进程

n的for循环(i = n - 1)迭代: svg2img使用svg并委托将其转换为另一个进程

循环结束,此时i等于frames.length

1的svg转换过程结束,并执行了回调。回调在外部作用域中引用了i变量,该变量的值为frames.length(分配给它的最后一个值)

n的svg转换过程结束,并执行了回调。回调在外部作用域中引用了i变量,该变量的值为frames.length(分配给它的最后一个值)