我正在尝试对 DynamoDB 执行两个异步函数。
在继续执行以下步骤(发送包含其数据的电子邮件)之前,我需要两者返回数据。
我该如何解决这个问题?
我使用以下代码:
var productParams = {
TableName: productsTable,
FilterExpression: 'client = :this_client',
ExpressionAttributeValues: { ':this_client': "someclient" }
};
dynamoClient.scan(productParams, function (err, data) {
if (err) {
console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
} else {
console.log("Query succeeded.");
data.Items.forEach(item => {
products.push(item)
});
}
});
var retailerParams = {
TableName: retailersTable,
FilterExpression: 'leadTime = :this_leadTime',
ExpressionAttributeValues: { ':this_leadTime': 42 }
};
dynamoClient.scan(retailerParams, function (err, data) {
if (err) {
console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
} else {
console.log("Query succeeded.");
data.Items.forEach(item => {
retailers.push(item)
});
}
});
var email = {
"Source": "somemail@gmail.com",
"Template": "some_template",
"Destination": {
"ToAddresses": ["somemail@gmail.com"]
},
"TemplateData": `{somedata}`
}
await ses.sendTemplatedEmail(email).promise();
最佳答案
您可以将 DynamoDB 调用转换为 Promise(通过将 scan
调用与 .promise()
调用链接起来)和 await
调用。他们使用 Promise.all
发送电子邮件之前:
var productParams = {
TableName: productsTable,
FilterExpression: 'client = :this_client',
ExpressionAttributeValues: { ':this_client': "someclient" }
};
const productsPromise = dynamoClient.scan(productParams).promise()
.then(data => {
data.Items.forEach(item => {
products.push(item)
});
})
.catch(err => {
console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
});
var retailerParams = {
TableName: retailersTable,
FilterExpression: 'leadTime = :this_leadTime',
ExpressionAttributeValues: { ':this_leadTime': 42 }
};
const retailersPromise = dynamoClient.scan(retailerParams).promise()
.then(data => {
console.log("Query succeeded.");
data.Items.forEach(item => {
retailers.push(item)
});
})
.catch(err => {
console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
});
await Promise.all([
productsPromise,
retailersPromise
]);
var email = {
"Source": "somemail@gmail.com",
"Template": "some_template",
"Destination": {
"ToAddresses": ["somemail@gmail.com"]
},
"TemplateData": `{somedata}`
}
await ses.sendTemplatedEmail(email).promise();
关于javascript - 在执行新函数之前,如何等待两个 DynamoDB 调用完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256834/