1 回答

TA貢獻1993條經驗 獲得超6個贊
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)
}
添加回答
舉報