node.js - 在nodejs中循环完成后执行条件语句
问题描述
我有一个用于检查多个上传图像的纵横比的 for 循环,在完成循环后,我想检查 if else 条件中的比率以重定向用户。问题是在循环完成之前检查条件,我需要在检查条件之前完成循环。我发现异步虽然可能适合这里,但我对实现的最佳方法感到困惑,谁能给我解决方法来按顺序执行代码。
//check image ratio
var validImageRatio = true;
for(i=0; i<req.files.propertyPhoto.length; i++){
var tempFile = req.files.propertyPhoto[i].tempFilePath.replace(/\\/g, '/');
var ratio;var width;var height;
var acceptedRatio = 3;
//get image ratio
sizeOf(tempFile, function (err, dimensions) {
width = dimensions.width;
height = dimensions.height;
ratio = width/height;
});
if (ratio < (acceptedRatio - 0.1) || ratio > (acceptedRatio + 0.1)) {
validImageRatio = false;
break;
}
}
//if ratio invalid, redirect
if (!validImageRatio) {
...
}
//if ratio valid, upload
else{
...
}
解决方案
由于您是异步进行检查,因此同步代码将首先运行。如果在 for 循环中使用 async/await,它将阻塞循环的每次迭代,使其运行速度变慢。您可以采用的方法是Promise.all
同时运行检查。
const promises = req.files.propertyPhoto.map(prop => new Promise(resolve => {
const tempFile = prop.tempFilePath.replace(/\\/g, '/');
const acceptedRatio = 3;
// get image ratio
sizeOf(tempFile, function (err, dimensions) {
const width = dimensions.width;
const height = dimensions.height;
const ratio = width / height;
if (ratio < (acceptedRatio - 0.1) || ratio > (acceptedRatio + 0.1)) {
return resolve(false);
}
resolve(true);
});
}));
const result = await Promise.all(promises);
if (result.some(r => r === false)) {
// if any of the ratio is invalid, redirect
} else {
// else upload
}
推荐阅读
- reactjs - ReactJS:通过 fetch 发布带有数据的请求
- python - pydoc 可以在 pyd 上操作,还是有与 pydoc 等效的在 pyd 上操作
- stripe-payments - 如何首次为多个订阅付费。条纹
- typescript - React Reduxjs 工具包未在 useSelector 中读取状态,使用 Typescript。是向我显示loginIn 不是布尔值的错误
- qr-code - 多用途二维码
- python - 用不同的选项调用 setsockopt 三次有什么作用
- scala - 解析单行可用的 CSV 数据
- ibm-doors - 使用 dxl 在模块中搜索文本
- reactjs - 有没有办法从普通函数访问 React Context?
- mariadb - Mariadb:按小时和其他列选择平均值