我在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?
答案 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
(分配给它的最后一个值)