javascript - AWS.DynamoDB.DocumentClient.put() 和 promise() 如何在 Lambda 中工作?(Javascript)
问题描述
一般来说,我对 javascript 很陌生,我正在做一个学校项目,该项目构建一个简单的 lambda 函数,以将一些数据从 HTTP 请求保存到 DynamoDB。
首先,我有这个版本:
exports.handler = async (event) => {
var params = {
TableName: 'graph',
ReturnConsumedCapacity: "TOTAL",
Item: null
};
for (let input of event.inputs) {
params.Item = {
'key' : input.key,
'value' : input.value
};
await DynamoDB.DocumentClient.put(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data);
}
});
}
};
据我浅薄的理解,像处理程序这样的异步函数应该等待任何等待语句完成执行,但我在数据库中什么也没有。但是,即使由于某些原因,如果 lambda 函数执行没有等待 DynamoDB.DocumentClient.put() 完成,那么 DynamoDB.DocumentClient.put() 不会在 lambda 返回后自行完成吗?
然后我按照其他人的例子,在最后添加了 promise() :
exports.handler = async (event) => {
var params = {
TableName: 'graph',
ReturnConsumedCapacity: "TOTAL",
Item: null
};
for (let input of event.inputs) {
params.Item = {
'key' : input.key,
'value' : input.value
};
await DynamoDB.DocumentClient.put(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data);
}
}).promise();
}
};
现在即使它成功地将数据放入数据库,日志显示 6 条“成功”消息,我只放入了 3 对键值对。经过一番尝试,我意识到“成功”消息在第一个回调中出现一次,在第二个回调中出现两次,在第三个回调中出现三次。我根本不知道它什么时候表现得像这样。有人可以对此有所了解吗?谢谢
解决方案
您正在混合回调和承诺。在引入 Promise 之前,回调是处理异步代码的首选方式(我猜仍然是某些人的首选方式)。不建议将这两者混合用于同一目的。
当您使用 Promise 类的内置“then”方法时,这会更正确:
await DynamoDB.DocumentClient.put(params)
.promise()
.then((data) => {
console.log(data);
})
.catch((err) => {
console.log(err);
});
不过,它也不会使用回调破坏任何东西。这是一个解释承诺的非常好的答案:
当它记录 6 次时,如果传递给循环的数组只有 3 个项目,那没有任何意义。如果您可以在原始帖子中提供输出,我会看看我是否能理解它并给您一个更新的答案。
推荐阅读
- view - 插入 Hive 中的视图
- azure - 服务结构是否适合下载和压缩
- c# - 如何反序列化 GZipStream?
- c - 用C编程,如何声明未知大小的数组以供以后使用?
- python - Flask-Cache 不断丢失实例方法的缓存
- jquery - 无法使用 Jquery 清除选择选项值
- objective-c - 如何获取(段偏移)每个不同的平面(IODeviceTree,IOService ....)进行转储?
- python - 如何将不同形状的np数组组合在一起并按行分隔
- hex - 在汇编语言 NASM 中将十进制转换为十六进制
- node.js - 如何在子进程nodejs中访问父全局变量