1 回答
TA贡献1993条经验 获得超5个赞
michael_cai的回答很准确了,我这里补充一下代码,如果你是不理解闭包的意思的话,实际是这样的
fs.writeFile(
imgName,
dataBuffer,
/*
* 这里主要分析一下这个回调函数,这个
* 回调函数执行时也许for循环已经执行
* 完毕并且退出了这时的imgName参数就
* 锁定为最后一次执行时的样子
*/
function(err){
if (err) {
console.log(err);
}else{
// 这里读取的上下文是当回调开始执行时的上下文而非声明时的上下文
console.log(imgName);
}
})
那么如何保存声明回调时的上下文能,最直接的办法就是将整个方法放入闭包中
因为闭包可以"保存"调用时的参数,将这个参数"私有化",注意,我这里的解释都是比较通俗的
准确的解释请参阅更多详细资料,这个不是闭包的定义,那么代码应该改为
for(let i = 0; i < imgDatas.length; i++){
elem = imgDatas[i].replace(/^data:image\/\w+;base64,/, '');
var dataBuffer = new Buffer(elem, 'base64');
var imgName = path.join(__dirname,'../public/tempImg/') +'img' + Date.now() + i + '.png';
//改写开始,这是一个比较简单的闭包,这样就能解决你的问题了
(function(imgName){
fs.writeFile(imgName, dataBuffer, function(err){
if (err) {
console.log(err);
}else{
console.log(imgName);
}
})
})(imgName)
}
添加回答
举报