第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

nodejs異步的一個(gè)問(wèn)題

nodejs異步的一個(gè)問(wèn)題

慕虎7371278 2018-10-12 10:15:37
在express中可以正常寫(xiě)入文件,寫(xiě)入文件名也是正確的但是console.log(imgName)每次輸出的結(jié)果都是一樣的 都是最后的文件名為什么呢,要怎么解決比較好router.post('/uploadImages', function(req, res){    var form = new multiparty.Form();    form.parse(req, function(err, fields, files){        //獲得瀏覽器提交的圖片數(shù)據(jù)        var imgDatas = fields.editImg;        //遍歷圖片數(shù)據(jù),然后寫(xiě)入到后臺(tái)        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ě)入文件            fs.writeFile(imgName, dataBuffer, function(err){                if (err) {                    console.log(err);                }else{                    console.log(imgName);                }            })        }    })})
查看完整描述

1 回答

?
ibeautiful

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)

}


查看完整回答
反對(duì) 回復(fù) 2018-11-24
  • 1 回答
  • 0 關(guān)注
  • 448 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)