【发布时间】:2021-12-11 04:02:05
【问题描述】:
我正在尝试将数据插入到我的数据库中,并且查询位于映射循环内,因此我使用异步函数等待循环结束,并将所有结果存储在我的变量“practicasAgregadas”中.
这就是我调用函数的方式:
insertarPracticas(turno_id, req.body.lista_codigos_practicas, queryInsertarPracticas)
.then(result => {
res.status(200).json({
"Practicas Agregadas": result
})
})
这是函数:
async function insertarPracticas(turno_id, req, queryInsertarPracticas) {
const res = await Promise.all(req.map(r => {
connection.query(
queryInsertarPracticas, [turno_id, r], (error2, row2) => {
if (error2) {
console.log("Error al insertar turno detalle (prácticas): " + r + " " + error2);
practicasNoAgregadas += r + "-";
} else {
console.log("Turnos detalle agregados " + r);
practicasAgregadas += r + "-";
console.log("practicas " + practicasAgregadas);
}
});
return practicasAgregadas;
})
)
console.log("en async " + res[0]);
return res;
}
在第一次尝试时,它返回空:
这是控制台:
在第二次尝试时,它确实返回了,但它重复了 3 次:
还有控制台:
【问题讨论】:
-
您正在尝试将普通异步回调与 Promise 混合使用。你不能这样做,因为
Promise.all()要求你传递它在异步操作完成时解析的承诺,但你的async函数不会这样做,因为connection.query()不会返回承诺。 -
(error2, row2) =>这是一个回调,你需要承诺它。你可能会发现connection.query如果没有提供回调,就会返回一个承诺,很多库似乎都在这样做现在。所以 ->const [turno_id, r] = await connection.query(),你也可以使用try / catch作为你的错误逻辑。请注意,您将需要 ->req.map(async r.....来等待。 -
@jfriend00 正确的方法是什么?我怎样才能让它返回一个承诺?
-
最简单的方法是使用数据库的 promise 接口而不是回调接口。然后
connection.query()将返回一个承诺。你不说你用的是什么数据库,但是如果是mysql,那么NPM上有一个支持promises的mysql模块。
标签: javascript express asynchronous promise