我的问题是我试图等待一些承诺,但我的等待呼叫似乎立即返回到调用函数。
在下面的代码中(处理POST的控制器功能的一部分),"文件出来"在执行promise之前执行函数调用之后的log。我的异步功能似乎在" await"调用
然而,"等待"仍然等待所有承诺执行,所以"我刚刚等待" log 将magic var正确插入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;
}
答案 0 :(得分:1)
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");
}
};