猿问

nodejs异步的一个问题

在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);

                }

            })

        }

    })

})


慕虎7371278
浏览 437回答 1
1回答

ibeautiful

michael_cai的回答很准确了,我这里补充一下代码,如果你是不理解闭包的意思的话,实际是这样的fs.writeFile(&nbsp; &nbsp; imgName,&nbsp;&nbsp; &nbsp; dataBuffer,&nbsp;&nbsp; &nbsp; /*&nbsp; &nbsp; &nbsp;* 这里主要分析一下这个回调函数,这个&nbsp; &nbsp; &nbsp;* 回调函数执行时也许for循环已经执行&nbsp; &nbsp; &nbsp;* 完毕并且退出了这时的imgName参数就&nbsp; &nbsp; &nbsp;* 锁定为最后一次执行时的样子&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; function(err){&nbsp; &nbsp; if (err) {&nbsp; &nbsp; &nbsp; &nbsp; console.log(err);&nbsp; &nbsp; }else{&nbsp; &nbsp; &nbsp; &nbsp; // 这里读取的上下文是当回调开始执行时的上下文而非声明时的上下文&nbsp; &nbsp; &nbsp; &nbsp; console.log(imgName);&nbsp; &nbsp; }})那么如何保存声明回调时的上下文能,最直接的办法就是将整个方法放入闭包中因为闭包可以"保存"调用时的参数,将这个参数"私有化",注意,我这里的解释都是比较通俗的准确的解释请参阅更多详细资料,这个不是闭包的定义,那么代码应该改为for(let i = 0; i < imgDatas.length; i++){&nbsp; &nbsp; elem = imgDatas[i].replace(/^data:image\/\w+;base64,/, '');&nbsp; &nbsp; var dataBuffer = new Buffer(elem, 'base64');&nbsp; &nbsp; var imgName = path.join(__dirname,'../public/tempImg/') +'img' + Date.now() + i + '.png';&nbsp; &nbsp; //改写开始,这是一个比较简单的闭包,这样就能解决你的问题了&nbsp; &nbsp; (function(imgName){&nbsp; &nbsp; &nbsp; &nbsp; fs.writeFile(imgName, dataBuffer, function(err){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (err) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(err);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(imgName);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; })(imgName)}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答