javascript - 在执行新函数之前,如何等待两个 DynamoDB 调用完成?

标签 javascript amazon-web-services asynchronous amazon-dynamodb

我正在尝试对 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/

相关文章:

javascript - 如何从 Javascript 中的 rails 加载的图像中获取原始图像尺寸?

amazon-web-services - 我可以使用 Cloudformation 在特定可用区中创建子网吗?

mysql - 如何用 NodeJS 处理这些 MySQL 情况

javascript - 如何防止组件随着 View 的增长而向上移动

javascript - 在 Express.js 中,为什么我下载的文件大小与服务器文件大小不同?

javascript - SVG 上的鼠标行为滞后

mysql - 使用 MySQL 将 Symfony 应用程序部署到 AWS

amazon-web-services - 基于用户通知偏好的 AWS SNS 移动推送

java - 如何将 Mono 变成真正的异步(非响应式!)方法调用?

javascript - 使用 RxJS 如何缓冲函数调用,直到另一个异步函数调用已解决