亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

nodejs異步的一個問題

nodejs異步的一個問題

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

1 回答

?
ibeautiful

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)

}


查看完整回答
反對 回復 2018-11-24
  • 1 回答
  • 0 關注
  • 451 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號