node.js - 等到 for 循环没有在节点 js 中完全执行
问题描述
我想在执行我的 for 循环时发送我的响应,但它直接发送而无需在 for 循环中等待
我尝试了不同的方式并在异步函数中应用等待,但它进入下一个
async (request, response) => {
let imageErr = [],
succArr = [];
/** Image processing and send to s3 */
const OriginalUrl = request.body.images;
for (const image of OriginalUrl) {
await createImage.createWebp(image, 'webp', (err, result) => {
if (err) {
imageErr.push(err);
} else {
succArr.push(result);
console.log(succArr);
}
});
/** webp */
await createImage.createJpeg(image, 'jpeg', (err, result) => {
if (err) {
imageErr.push(err);
} else {
succArr.push(result);
console.log(succArr);
}
});
}
if (succArr === 12) responseUtil.success(response, succArr);
else responseUtil.error(response, 'Fail');
};
我希望在 for 循环完全执行后发送响应
解决方案
似乎您使用了接受回调而不是返回 Promise 的那种框架(这是await
正常工作所必需的)。一种方法是将你的调用包装成一个 Promise。尝试这样的事情:
for (const image of OriginalUrl) {
await new Promise((res, rej) => {
createImage.createWebp(image, 'webp', (err, result) => {
if (err) {
imageErr.push(err);
} else {
succArr.push(result);
}
res(); // <-- Important
});
});
(...)
}
您也可以使用rej
,但您必须将其作为异常捕获。你的选择。
旁注: if (succArr === 12)
,你的意思是if (succArr.length === 12)
?另外,我认为这是为了调试,因为硬编码 literal 绝对不是一个好主意12
。
推荐阅读
- javascript - 请问如何修复控制台上显示的“data.forEach 不是函数”错误
- r - 如何在ggplot2的facet_grids中为分组数据的每个箱线图添加文本注释
- c# - 使用 LINQ 对 ID、EmailListID、PhoneListID 等进行分组
- power-automate - Power Automate:按 GUID 运行子流
- reactjs - SVGPathElement 和
使用扩展运算符 React Typescript 时 - python - VSCode Jupyter 无法自动更新内核
- reactjs - 为什么显示 DELETE /api/product/productId 404
- apache-spark - 使用 Spark 读取 Elasticsearch 记录时时间戳无效
- pine-script - How to apply formula to several securities
- wxpython - MSW 上的 WxPython,DirPickerCtrl 随时间使用不同的对话框