为了账号安全,请及时绑定邮箱和手机立即绑定

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条经验 获得超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)

}


查看完整回答
反对 回复 2018-11-24
  • 1 回答
  • 0 关注
  • 436 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信