ES8等待电话不等我
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES8等待电话不等我相关的知识,希望对你有一定的参考价值。
我的问题是我正在尝试等待一些承诺,但我的等待呼叫似乎立即返回到调用函数。
在下面的代码中(处理POST的控制器函数的一部分),在执行promises之前执行函数调用之后的“文件出来”日志。我的异步函数似乎在“等待”调用时返回。
然而,“await”仍然等待所有承诺执行,所以“我刚刚完成等待”日志确实将魔术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;
}
答案
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");
}
};
以上是关于ES8等待电话不等我的主要内容,如果未能解决你的问题,请参考以下文章
在 React 应用中设置 Babel 生成的 EcmaScript 版本
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段