簡體   English   中英

為什么我在循環中的 `async` 函數無法正常工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM