我的问题是,我试图等待一些承诺,但我的等待调用似乎马上返回到调用函数。
在下面的代码中(控制器函数处理POST的一部分),在执行承诺之前执行我的函数调用之后的“文件出站”日志。我的异步函数似乎在“等待”调用时返回。
然而,“等待”仍然等待所有承诺的执行,因此“我刚刚完成等待”日志确实正确地将魔术变量插入到req.files中。
const upload = multer({
storage: multer.diskStorage ({
destination: (req, file, cb) => { cb(null, config.DESTINATION) }
})
}).array(config.FIELD_NAME);
exports.upload_image = function(req, res) {
upload(req, res, (err) => {
if (err) {
return res.end("error uploading file");
}
// got file ok, do validation
checkAreDicom2( req.files );
console.log("files coming out: ", req.files);
return res.end("OK");
});
}
async function checkAreDicom2(inFiles) {
let promises = inFiles.map(function (file) {
return new Promise( function (resolve, reject) {
fs.createReadStream(file.path,{start: 128, end: 131, autoClose: true})
.on('error',reject)
.on('data', (chunk) => file.magic = file.magic ? file.magic += chunk : chunk)
.on('end', resolve);
});
});
await Promise.all(promises);
console.log("i just finished waiting: ", inFiles);
return;
}发布于 2018-02-28 10:50:51
await正在等待Promise.all,它正确延迟之后的日志。但是,它当然不会阻塞函数的调用方。
因此,upload_image中的回调不会等待异步处理,它只会收到checkAreDicom2(…)返回的承诺--并放弃它,并立即记录某些内容。您需要再次显式地等待异步结果。
exports.upload_image = async function(req, res) {
try {
await new Promise((resolve, reject) => {
upload(req, res, (err) => {
if (err) reject(err);
else resolve();
});
});
// got file ok, do validation
await checkAreDicom2( req.files );
// ^^^^^
console.log("files coming out: ", req.files);
return res.end("OK");
} catch(err) {
return res.end("error uploading file");
}
};https://stackoverflow.com/questions/49026614
复制相似问题