[英]Why is my `async` function inside a loop not working as it should?
我試圖在循環中運行 MySQL DELETE 命令,試圖刪除多個項目。 下面是我用 Node.js 編寫的 AWS Lambda 代碼。
const mysql = require('mysql2');
const errorCodes = require('source/error-codes');
const PropertiesReader = require('properties-reader');
const prop = PropertiesReader('properties.properties');
const con = mysql.createConnection({
host: prop.get('server.host'),
user: prop.get("server.username"),
password: prop.get("server.password"),
port: prop.get("server.port"),
database: prop.get("server.dbname")
});
exports.deleteSellerPortfolioItemImages = async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
if (event.body == null && event.body == undefined) {
var response = errorCodes.missing_parameters;
callback(null, response)
}
else {
let body = JSON.parse(event.body)
let response="";
//console.log("body", body);
for(let i=0;i<body.length;i++)
{
let idseller_portfolio_item_images = Number(body[i].idseller_portfolio_item_images);
console.log(idseller_portfolio_item_images);
if (isNaN(idseller_portfolio_item_images)) {
response = errorCodes.invalid_parameter;
callback(null, response);
}
else {
// allows for using callbacks as finish/error-handlers
const sql = "DELETE FROM seller_portfolio_item_images WHERE idseller_portfolio_item_images = ? ";
await con.execute(sql, [idseller_portfolio_item_images], function (err, result) {
if (err) {
console.log(err.toString());
if (err.toString().indexOf('cannot be null') >= 0) {
response = errorCodes.not_null_parameters;
callback(null, response);
}
response = errorCodes.internal_server_error;
callback(null, response);
}
else {
response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": JSON.stringify({ status: 1 }),
"isBase64Encoded": false
};
}
});
}
}
//If there is no error, this response will be sent back after the for loop
callback(null, response);
}
};
然而,這只是返回一個空響應,沒有記錄被刪除。
但是如果我刪除callback(null, response);
在for
循環之后,記錄將被刪除。 在這種情況下,無論如何都會發回錯誤,因為沒有callback
。
我認為這是因為我的代碼沒有等待 for 循環完成而只是等待callback
。
我也試過如下。
const mysql = require('mysql2');
const errorCodes = require('source/error-codes');
const PropertiesReader = require('properties-reader');
const prop = PropertiesReader('properties.properties');
const con = mysql.createConnection({
host: prop.get('server.host'),
user: prop.get("server.username"),
password: prop.get("server.password"),
port: prop.get("server.port"),
database: prop.get("server.dbname")
});
exports.deleteSellerPortfolioItemImages = (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
if (event.body == null && event.body == undefined) {
var response = errorCodes.missing_parameters;
callback(null, response)
}
else {
let body = JSON.parse(event.body)
let response="";
body.forEach(async (element, index)=>{
let idseller_portfolio_item_images = Number(element.idseller_portfolio_item_images);
console.log(idseller_portfolio_item_images);
if (isNaN(idseller_portfolio_item_images)) {
response = errorCodes.invalid_parameter;
callback(null, response);
}
else {
// allows for using callbacks as finish/error-handlers
const sql = "DELETE FROM seller_portfolio_item_images WHERE idseller_portfolio_item_images = ? ";
await con.execute(sql, [idseller_portfolio_item_images], function (err, result) {
if (err) {
console.log(err.toString());
if (err.toString().indexOf('cannot be null') >= 0) {
response = errorCodes.not_null_parameters;
callback(null, response);
}
response = errorCodes.internal_server_error;
callback(null, response);
}
else {
response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": JSON.stringify({ status: 1 }),
"isBase64Encoded": false
};
}
});
}
})
callback(null, response);
}
};
這也給出了與上面相同的結果。
為什么我的async
調用不起作用?
forEach
函數執行數組中每個元素的給定函數,在您的情況下是異步函數,但您不是在等待異步函數結果。 有多種方法可以解決顯示的此示例代碼
選項 1
const promises = body.map(async () => {....});
// using 'all' just for demo use appropriate function in your case
await Promise.all(promises);
// more code
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.