最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

来自Lambda Node JS的多个Dynamo DB调用

运维笔记admin19浏览0评论

来自Lambda Node JS的多个Dynamo DB调用

来自Lambda Node JS的多个Dynamo DB调用

我需要遍历一个json并对dynamo db进行多次getitem调用。我的问题是节点js飞过代码而不等待函数返回,所以我不能创建一个具有标题,多个计算行,然后是页脚的xml。

在下面的示例中,!make footer将在函数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);
            }
        });
回答如下:

有几种模式可以解决这个问题;第一个是你已经在你的代码中得到的,这是回调函数。传递给dynamodb.GetItem()的函数是一个在运行其他代码后执行的回调函数,因此可以访问结果(data)。

更现代的方法是使用Promises,这需要一些时间来理解。虽然值得这样做,但是当你使用最新的方式,即asyncawait时,你可以理解幕后发生的事情,它看起来像这样:

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);
    }
}

请注意,lambdaHandler()taxrate()都已变成async函数。在for循环中,我们现在awaited taxrate()的结果。 getItem的回调已被替换为返回promise的方法。

发布评论

评论列表(0)

  1. 暂无评论