在Node中多个文件上传,强制同步回调?

时间:2017-01-25 01:11:25

标签: javascript node.js

我的表单中包含一个可以在单个boost::simple_segregated_storage<int> pStorage; const int num_partitions = 100; const int partition_sz = sizeof(int); const int block_sz = partition_sz * num_partitions; int block[block_sz] = {}; pStorage.segregate(block, block_sz, partition_sz); int* pInt = (int*)pStorage.malloc(); // <-- Crashes here 标记中上传多个图像的字段。当我使用Node访问文件系统时,它似乎将回调队列化为异步读/写文件。因为我有多个文件,所以我在public ActionResult Beacon(string value) { var dir = Server.MapPath("/Content/Images/Sprites/"); var path = Path.Combine(dir, "logo.png"); var theFile = new FileInfo(path); if (theFile.Exists) { return File(System.IO.File.ReadAllBytes(path), "image/png"); } return this.HttpNotFound(); } 循环中进行了这些调用,因此在回调被命中时,<input>的值始终为for,从而导致对象未定义。

i

2 个答案:

答案 0 :(得分:1)

您可以使用IIFE(立即调用的函数表达式)在for循环的每次迭代期间捕获i的正确值:

for (var i = 0; i < req.files.photos.length; i++) {
    (function(j) {
        req.fs.readFile(req.files.photos[j].path, function(err, data) {
            if(err) throw err;
            var test = req.files.photos[j];

            console.log(test.name);
            console.log(test.originalFileName);

            var newPath = __dirname + "/../public/uploads/" + req.files.photos[j].name;

            req.fs.writeFile(newPath, data, function (err) {
                if (err) throw err;
                console.log("it worked");
            });
        });
    }(i));
}

通过立即调用此函数,i的值将以其当前值捕获并存储为函数内的新引用(j),因为i是原始值。这是范围链和闭包语法的典型示例,如果您仍然遇到问题,还有更多在线示例

答案 1 :(得分:0)

最简单的方法是切换到使用承诺的async/await。如果你需要同时做这两件事,你可以使用Promise.all。

习惯承诺或设置async / await需要花一些时间,但它是100%值得的。

import pify from 'pify';
import {readFile, writeFile} from 'fs';

const readFilePr = pify(readFile);
const writeFilePr = pify(writeFile);

async function copyFiles(req) {
 const {photos} = req.files;

  for (let photo of photos) {
    try {
      const image = await readFilePr(photo.path);
      const newPath = `${__dirname}/../public/uploads/${photo.name}`;
      await writeFilePr(newPath);    
    } catch (e) {
      console.error("Problem copying download: ",e);
    }     
  }
}

您可能需要设置babel才能使所有代码生效(假设没有拼写错误或其他任何内容,我还没有测试过。)