我的表单中包含一个可以在单个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
答案 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
才能使所有代码生效(假设没有拼写错误或其他任何内容,我还没有测试过。)