从 Sequelize 中的承诺内部打破 for 循环
Break a for loop from inside a promise in Sequelize
我试图在找到第一个结果和 returns 第一个响应时打破 sequelize promise 内的循环,但它总是执行整个循环。如果我在 promise 中为变量赋值,该值就会在 promise 之外消失。我已经努力了好几天,如果有人能帮助我,我将不胜感激。这是我的代码:
for (let i = (parseInt(req.query.units) - 1); i >= 0; i--) {
console.log (i);
db.order_planned.findAll({
where: {
barcode: parseInt(req.query.barcode) + i,
stepdesc: req.query.stepdesc
},
limit: 1,
}).then((data) => {
if (data[0].length > 0) {
data[0].barcode = (parseInt(data[0].barcode) - i);
console.log(data[0]);
res.status(200).json(data[0]);
break; // illegal break
}
}).catch((error) => {
let err_msg = new ErrorMsg(error);
res.status(err_msg.status).json(err_msg);
});
}
您想遍历 n 个承诺和 return 第一个解决的承诺。
Promise.any() 就是这样做的。
使用代码的简化版本:
const promises = [];
for (let i = (parseInt(req.query.units) - 1); i >= 0; i--) {
promises.push(
db.order_planned.findAll({ /*..*/ }).then((data) => {
/*..*/
return data[0]; // Found your data
});
);
}
// As soon as the first promise is returned, log it.
Promise.any(promises).then(firstResult => console.log(firstResult));
由于 promises 的工作方式,循环将始终在 returned 任何 promise 之前完整执行。
或者,您可以使用 async/await 来获得您想要的:
for (let i = (parseInt(req.query.units) - 1); i >= 0; i--) {
const data = await db.order_planned.findAll({ /*..*/ }); // Use await here
if (data[0].length > 0) {
/*..*/
break; // Can now do a break here
}
}
但是,这会导致性能变差,因为 promise 不是并行执行的。
我试图在找到第一个结果和 returns 第一个响应时打破 sequelize promise 内的循环,但它总是执行整个循环。如果我在 promise 中为变量赋值,该值就会在 promise 之外消失。我已经努力了好几天,如果有人能帮助我,我将不胜感激。这是我的代码:
for (let i = (parseInt(req.query.units) - 1); i >= 0; i--) {
console.log (i);
db.order_planned.findAll({
where: {
barcode: parseInt(req.query.barcode) + i,
stepdesc: req.query.stepdesc
},
limit: 1,
}).then((data) => {
if (data[0].length > 0) {
data[0].barcode = (parseInt(data[0].barcode) - i);
console.log(data[0]);
res.status(200).json(data[0]);
break; // illegal break
}
}).catch((error) => {
let err_msg = new ErrorMsg(error);
res.status(err_msg.status).json(err_msg);
});
}
您想遍历 n 个承诺和 return 第一个解决的承诺。 Promise.any() 就是这样做的。
使用代码的简化版本:
const promises = [];
for (let i = (parseInt(req.query.units) - 1); i >= 0; i--) {
promises.push(
db.order_planned.findAll({ /*..*/ }).then((data) => {
/*..*/
return data[0]; // Found your data
});
);
}
// As soon as the first promise is returned, log it.
Promise.any(promises).then(firstResult => console.log(firstResult));
由于 promises 的工作方式,循环将始终在 returned 任何 promise 之前完整执行。
或者,您可以使用 async/await 来获得您想要的:
for (let i = (parseInt(req.query.units) - 1); i >= 0; i--) {
const data = await db.order_planned.findAll({ /*..*/ }); // Use await here
if (data[0].length > 0) {
/*..*/
break; // Can now do a break here
}
}
但是,这会导致性能变差,因为 promise 不是并行执行的。