Node.js 来自Lambda节点JS的多个Dynamo DB调用

Node.js 来自Lambda节点JS的多个Dynamo DB调用,node.js,amazon-web-services,aws-lambda,amazon-dynamodb,Node.js,Amazon Web Services,Aws Lambda,Amazon Dynamodb,我需要循环使用json并对dynamo db进行多个getitem调用。我的问题是node js在代码中快速运行,而不是等待函数返回,因此我无法创建一个包含页眉、多个计算行和页脚的xml 在下面的示例中!makefooter将在taxrate函数完成之前很久编写。如何强制脚本等待taxrate函数完成 !make xml header for(i=0; i<linelength; i++) { business_unit = '100' inv

我需要循环使用json并对dynamo db进行多个getitem调用。我的问题是node js在代码中快速运行,而不是等待函数返回,因此我无法创建一个包含页眉、多个计算行和页脚的xml

在下面的示例中!makefooter将在taxrate函数完成之前很久编写。如何强制脚本等待taxrate函数完成

!make xml header 
 for(i=0; i<linelength; i++)
    {

        business_unit = '100'
        invoice_line = 1
        total = 100
        taxrate(business_unit, invoice_line, total);       
        !write line xml
    }
!make xml footer

function taxrate(business_unit, i, gross_total) {

        const params = {
            Key: {
                "tax_rate": {
                    S: business_unit
                }
            },
            TableName:"tax_table"
        };
        dynamodb.getItem(params,function(err, data){
            if(err) {
                console.log("call error");
                console.log(err);

            } else {
               console.log(data.Item.tax.N);
               return(data.Item.tax.N);
            }
        });
!生成xml标头

对于(i=0;i有几种模式可用于解决此问题;第一种模式是代码中已有的模式,即回调函数。传递给
dynamodb.GetItem()
的函数是在运行其他代码后执行的回调,因此可以访问结果(
data

一种更现代的方法是使用,这需要一点时间来理解。但是,这样做是值得的,这样当您使用最新的方法时,您可以了解幕后发生了什么,这是
async
wait
,如下所示:

exports.lambdaHandler = async (event, context) => {
    !make xml header 
    for(i=0; i<linelength; i++)
        {

            business_unit = '100'
            invoice_line = 1
            total = 100
            await taxrate(business_unit, invoice_line, total);       
            !write line xml
        }
    !make xml footer   
}

async function taxrate(business_unit, i, gross_total) {
    const params = {
        Key: {
            "tax_rate": {
                S: business_unit
            }
        },
        TableName:"tax_table"
    };
    try {
        let data = await dynamodb.getItem(params).promise();
        return data.Item.tax.N;
    } catch(err) {
        console.log("call error");
        console.log(err);
    }
}
exports.lambdaHandler=async(事件、上下文)=>{
!生成xml标头
对于(i=0;i