首页 > 解决方案 > 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 对键值对。经过一番尝试,我意识到“成功”消息在第一个回调中出现一次,在第二个回调中出现两次,在第三个回调中出现三次。我根本不知道它什么时候表现得像这样。有人可以对此有所了解吗?谢谢

标签: javascriptnode.jsaws-lambdapromise

解决方案


您正在混合回调和承诺。在引入 Promise 之前,回调是处理异步代码的首选方式(我猜仍然是某些人的首选方式)。不建议将这两者混合用于同一目的。

当您使用 Promise 类的内置“then”方法时,这会更正确:

    await DynamoDB.DocumentClient.put(params)
          .promise()
          .then((data) => {
             console.log(data);
           })
          .catch((err) => {
             console.log(err);
           });

不过,它也不会使用回调破坏任何东西。这是一个解释承诺的非常好的答案:

承诺不只是回调吗?

当它记录 6 次时,如果传递给循环的数组只有 3 个项目,那没有任何意义。如果您可以在原始帖子中提供输出,我会看看我是否能理解它并给您一个更新的答案。


推荐阅读