Есть несколько шаблонов для решения этой проблемы;первый - тот, который вы уже получили в своем коде, это функция обратного вызова.Функция, которую вы передаете 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
был заменен методом, который возвращает обещание.