1 回答

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
michael_cai的回答很準(zhǔn)確了,我這里補(bǔ)充一下代碼,如果你是不理解閉包的意思的話,實(shí)際是這樣的
fs.writeFile(
imgName,
dataBuffer,
/*
* 這里主要分析一下這個(gè)回調(diào)函數(shù),這個(gè)
* 回調(diào)函數(shù)執(zhí)行時(shí)也許for循環(huán)已經(jīng)執(zhí)行
* 完畢并且退出了這時(shí)的imgName參數(shù)就
* 鎖定為最后一次執(zhí)行時(shí)的樣子
*/
function(err){
if (err) {
console.log(err);
}else{
// 這里讀取的上下文是當(dāng)回調(diào)開(kāi)始執(zhí)行時(shí)的上下文而非聲明時(shí)的上下文
console.log(imgName);
}
})
那么如何保存聲明回調(diào)時(shí)的上下文能,最直接的辦法就是將整個(gè)方法放入閉包中
因?yàn)殚]包可以"保存"調(diào)用時(shí)的參數(shù),將這個(gè)參數(shù)"私有化",注意,我這里的解釋都是比較通俗的
準(zhǔn)確的解釋請(qǐng)參閱更多詳細(xì)資料,這個(gè)不是閉包的定義,那么代碼應(yīng)該改為
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';
//改寫(xiě)開(kāi)始,這是一個(gè)比較簡(jiǎn)單的閉包,這樣就能解決你的問(wèn)題了
(function(imgName){
fs.writeFile(imgName, dataBuffer, function(err){
if (err) {
console.log(err);
}else{
console.log(imgName);
}
})
})(imgName)
}
添加回答
舉報(bào)