【发布时间】:2018-08-02 19:43:36
【问题描述】:
我有基于 AWS Lambda 的无服务器应用程序,并使用 async/await 模式来访问来自 DynamoDB(和其他异步调用)的所有数据:
exports.handler = async (event) => {
try {
const params = {
TableName : "Items"
};
const data = await docClient.scan(params).promise();
const items = data.Items;
// use items
}
catch(err) {
// error handling
}
}
当然,为了让事情变得更好,我将所有此类调用移至以下函数:
exports.handler = async (event) => {
try {
const data = await getItems();
const items = data.Items;
// use items
}
catch(err) {
// error handling
}
}
let getItems = async function() {
let params = {
TableName : "Items"
};
return await docClient.scan(params).promise();
};
// getFeatures(), writeObjects(), putAnything() implementations
问题很明显——我每次都必须知道取决于数据库调用类型的数据格式——它可以是“data.Items”或“data.Item”等。这会破坏封装。函数内部有没有像“map”Promise 这样的方法从“data.XXX”返回结果承诺,而不仅仅是“data”?期望的结果:
const items = await getItems();
【问题讨论】:
-
这和promise有什么关系?在您
awaited 之后,您将拥有一个普通值,并且可以像往常一样访问任意属性名称,例如data[params.TableName]. -
顺便说一句,
let getItems = async function() {可以缩短为async function getItems() { -
@Bergi 不幸的是,你不明白什么是问题。在 awaitng 之后执行字段访问的可能性无关 - 自然是有可能的。这是关于程序设计的。将有关如何从函数中访问字段的信息移出会破坏封装,因为函数的基本思想是隐藏数据的接收方式。 AWS DynamoDB Docclient 的问题在于,对于不同的数据访问方法(查询、获取、扫描、放置),它不是直接返回结果,而是作为对象的一部分,例如 { Items/Item/other:
} -
所以您的问题不在于 promises 或 async/await(正如您的标题所暗示的那样),而是具体而言如何设计您的程序以通用方式与 AWS DynamoDB Docclient 一起使用?
标签: amazon-web-services promise async-await aws-lambda aws-sdk