javascript - 从 foreach 插入数组并使其在 foreach 外部可用

标签 javascript arrays node.js

我坚持循环遍历一个数组,该数组从 promise 接收值并将值推送到一个在 foreach 之外可用的新数组中。

我有什么:

   app.post('/submit', function (req, res) {
      uploadPics(req, res, function (err) {
        if (err instanceof multer.MulterError) {
            res.send(JSON.stringify({UploadResult: err.message}));
            console.log(err.message + ' ' +'Redirect /home');
        } else if (err) {
            console.log(err);
        } else {
            res.send(JSON.stringify({UploadResult: 'Success'}));
            var filesarray = req.files;
            var picinfos = [];

            filesarray.forEach(function(file){
                GetFileMetaInfo.filemetainfo(file.path).then(function (metadata){
                    //Stuck here! Can push values into an array (picinfos) but only available in the foreach. not outside..
                })
            })
            //I need picinfos array here....
        }   
    }) 
})

我如何接收我的元数据:

var exif = require('exif-parser');
var fs = require('fs');


exports.filemetainfo = function (filepath) {
    return new Promise((resolve) => {
        var file = filepath;
        var buffer = fs.readFileSync(file);
        var parser = exif.create(buffer);
        var result = parser.parse();
        resolve (result);
     }).then(function (metadata){
         if (metadata.tags.CreateDate !== undefined){
                date = new Date (metadata.tags.CreateDate*1000);
                datevalues = [
                    date.getFullYear(),
                    date.getMonth()+1,
                    date.getDate(),
                    date.getHours(),
                    date.getMinutes(),
                    date.getSeconds(),
                 ];
                 CreateDate = date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate();
                 CreateTime = date.getHours()+':'+date.getMinutes()+':'+date.getSeconds();
                 console.log("CrDate:" +CreateDate, "CrTime:" +CreateTime );
                } else {
                        console.log("No Metadata Creation Infos found in " +filepath);
                        CreateDate = "";
                        CretaeTime = "";
                }

                if (metadata.tags.GPSLatitude !== undefined){
                    GPSLat = metadata.tags.GPSLatitude;
                    GPSLon = metadata.tags.GPSLongitude;
                    console.log("GPSLat:" + GPSLat , "GPSLon:" +GPSLon); 
                }
                else {
                    console.log("No Metadata GPS Infos found in " +filepath)
                    GPSLat = "";
                    GPSLon = "";
               }
                return MetaData = {
                    GPSLat: GPSLat ,
                    GPSLon: GPSLon,
                    CreateDate: CreateDate,
                    CreateTime: CreateTime,
                    }   
        })
}

我可以请人帮忙吗?我怎样才能让我的数组在 foreach 之外可用。非常感谢!

最佳答案

forEach 末尾得到空数组的原因是,GetFileMetaInfo.filemetainfo() 返回一个 promise 并且 forEach不会等待异步操作。

您可以使用 async/awaitfor...of 循环来获得您想要的结果。

app.post('/submit', function (req, res) {
  uploadPics(req, res, async function (err) { // note async here
    if (err instanceof multer.MulterError) {
        res.send(JSON.stringify({UploadResult: err.message}));
        console.log(err.message + ' ' +'Redirect /home');
    } else if (err) {
        console.log(err);
    } else {
        res.send(JSON.stringify({UploadResult: 'Success'}));
        var filesarray = req.files;
        var picinfos = [];

        for(let file of filesarray) {
          const metadata = await GetFileMetaInfo.filemetainfo(file.path);
          // push metadata into your array here
          picinfos.push(metadata);
        }

        // You will have picinfos here
    }   
  })
})

关于javascript - 从 foreach 插入数组并使其在 foreach 外部可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53815284/

相关文章:

node.js - Nodejs 异步在完成之前调用排出回调

javascript - 使用 Bootstrap Popover 阻止父操作

javascript - 如何通过jquery创建选择框

arrays - ReDim在Visual Basic 6中保留为多维数组

javascript - MongoDB 对大容量数据进行排序

node.js - 调试proctor(带/不带webstorm)

javascript - Greasemonkey与jQuery,如何编写greasemonkey脚本来修改页面DOM元素?

javascript - 我选择红色,然后如果我单击第二张图像的左上角,它就会变成红色

java.lang.IllegalArgumentException : Illegal base64 character -1

java - 将 JDBC 的结果集加载到二维表中