Многократные вызовы Dynamo DB из Lambda Node JS - PullRequest
0 голосов
/ 15 февраля 2019

Мне нужно перебрать json и сделать несколько вызовов getitem для динамо-базы данных.Моя проблема в том, что узел js просматривает код, не дожидаясь возврата функции, поэтому я не могу создать xml с заголовком, несколькими вычисляемыми строками и нижним колонтитулом.

В приведенном ниже примере! Нижний колонтитул make будет записан задолго до того, как завершится функция 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);
            }
        });

1 Ответ

0 голосов
/ 15 февраля 2019

Есть несколько шаблонов для решения этой проблемы;первый - тот, который вы уже получили в своем коде, это функция обратного вызова.Функция, которую вы передаете dynamodb.GetItem(), является обратным вызовом, который выполняется после запуска какого-либо другого кода, так что к результату (data) можно получить доступ.

Более современный способ - использовать Обещания , для понимания которых требуется немного времени.Однако стоит сделать это, чтобы вы могли понять, что происходит за кулисами, когда вы используете новейший способ, который async и await, который будет выглядеть следующим образом:

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 мы теперь await отредактировали результат taxrate().Обратный вызов getItem был заменен методом, который возвращает обещание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...