我正在嘗試將資料插入到我的資料庫中,并且查詢在地圖回圈內,因此我使用異步函式來等待回圈結束,并將所有結果存盤在我的變數“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 次:

和控制臺:

uj5u.com熱心網友回復:
大多數使用異步函式的現代 JS 庫將回傳一個承諾,但如果提供了回呼,則通常不會回傳一個承諾。
所以假設 connection.query 確實回傳了一個承諾,那么下面的代碼應該做你之后的事情..
async function insertarPracticas(turno_id, req, queryInsertarPracticas) {
const res = await Promise.all(
req.map(async (r) => {
try {
const row2 = await connection.query(queryInsertarPracticas, [
turno_id, r
]);
console.log("Turnos detalle agregados " r);
practicasAgregadas = r "-";
console.log("practicas " practicasAgregadas);
} catch (e) {
console.log(
"Error al insertar turno detalle (prácticas): "
r " " error2
);
practicasNoAgregadas = r "-";
}
return practicasAgregadas;
})
);
console.log("en async " res[0]);
return res;
}
請記住,不要使用回呼,否則可能會向庫表明您不希望回傳承諾。
如果由于某種原因,lib 很長一段時間沒有更新,您將需要承諾查詢..
在 node 中,有一個名為 promisify https://nodejs.org/api/util.html#utilpromisifyoriginal的不錯的實用程式,可以使這更容易一些。
例如。
const conQuery = util.promisify(connection.query);
const row2 = await conQuery(queryInsertarPracticas....
如果回呼不是(error, result)你需要使用 Promise 建構式的形式。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise,但看看你的(error2, row2) =>不需要的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/380619.html
標籤:javascript 表达 异步 承诺
