【问题标题】:Is there a way to make promise "mapping" inside async function (AWS DynamoDB SDK usecase example)?有没有办法在异步函数中做出承诺“映射”(AWS DynamoDB SDK 用例示例)?
【发布时间】: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


【解决方案1】:

在你的函数返回之前添加一个then 到你的promise 中,让它为你转换promise 结果。比如:

const getItems = function() {
    let params = {
        TableName : "Items"
    };

    return docClient.scan(params).promise()
        .then(data => data.Items);
};

【讨论】:

    【解决方案2】:

    我发现行之有效的方法非常简单。它基于 await 的结果总是转换为已解决的承诺这一事实:

    exports.handler = async (event) => {
      try {
        const items = await getItems();
    
        // use items
      }
      catch(err) {
        // error handling
      }
    }
    
    const getItems = async function() {
        const params = {
            TableName : "Items"
        };
    
        const data = await docClient.scan(params).promise();
        return data.Items;
    };
    
    // getFeatures(), writeObjects(), putAnything() implementations
    

    【讨论】:

      【解决方案3】:

      如果我对问题的理解正确,那如何...

      const {item, items} = await getItems()
      
      // check which one has a value.
      

      基本上一个是未定义的,不幸的是我现在不在所以无法测试它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-05
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        • 1970-01-01
        • 2020-03-05
        • 1970-01-01
        相关资源
        最近更新 更多