繁体   English   中英

AWS DynamoDB:从 Promise 内部返回值

[英]AWS DynamoDB: Returning values from inside a Promise

我有一个对 dynamoDB 的异步调用:

  async getCostCenterTagFromTable() {
    // Create the DynamoDB service object
    var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
    var params = {
      TableName: 'csv-table',
      Key: {
        'BusinessUse': {S: 'eWFM'}
      },
      ProjectionExpression: 'CostCenter'
    };
    try {
      // Asynchronously retrieve value from DynamoDB
      const costCenter = await ddb.getItem(params).promise();
      return costCenter;
    }catch (error) {
      console.error(error);
    }
  }

我可以很好地查看返回的 Promise 中的内容,但我无法弄清楚如何从 then() 块中删除值并将其返回到另一个函数。 我的 getCostCenterTagValue 函数需要返回一个字符串。 该字符串愉快地驻留在承诺的 then() 块中。 我需要将它取出并归还,但它总是以未定义状态返回。 我知道这是这个调用的异步性质的一个问题,我已经尝试了一切从 then 块中获取该值但无济于事。 任何帮助将不胜感激!

  getCostCenterTagValue() {
    var costCenter = this.getCostCenterTagFromTable();
    costCenter.then(console.log);
    //INFO  { Item: { AutoTag_CostCenter: { S: '1099:802:000000' } } }
    var costCenterString = costCenter.then(data => {
      console.log("Cost Center Tag:" + data.Item.AutoTag_CostCenter.S);
      //INFO Cost Center Tag:1099:802:000000
      return data.Item.AutoTag_CostCenter.S;
    }).catch(function(err) {
      console.log(err);
    });
    console.log(costCenter.then())
    return costCenterString(???); // or return costCenter.then(???)
  }

问题是async getCostCenterTagFromTable()返回一个承诺。 因此,您需要await它被消耗的值,如下所示:

async getCostCenterTagValue() {
    var costCenter = await this.getCostCenterTagFromTable();

    var costCenterString = costCenter.Item.AutoTag_CostCenter.S;

    return costCenterString; 
  }

function logCostCenterTagValue() {
    getCostCenterTagValue().then(console.log);
}

这与 AWS 或 Dynamo 没有任何关系,这纯粹是一个异步问题:查看这个广受欢迎的答案以获取更多信息: 如何从异步调用返回响应?

经过多次挫折,我终于找到了一个干净、简单的解决方案:Deasync! 这真的应该是一个内置功能,正是我所需要的。 这让我使用一个变量从异步调用而不局限于一个承诺内则()块的极窄的范围,而我的函数可以返回一个字符串,而不是一个愚蠢的承诺,立即执行。

  getCostCenterTagValue() {
    let _data;
    let done = false;
    // Create the DynamoDB service object
    var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
    var params = {
      TableName: 'csv-table',
      Key: {
        'BusinessUse': {S: 'eWFM'}
      },
      ProjectionExpression: 'AutoTag_CostCenter'
    };
    try {
      // Retrieve the item
      ddb.getItem(params).promise().then((data) => {
        _data = data.Item.AutoTag_CostCenter.S;
        done = true;
        console.log("CostCenter: " + _data);
    });
    }catch (error) {
       console.error(error);
    }
    // Wait for asynchronous call to complete!
    require('deasync').loopWhile(function(){return !done;});
    return _data;
  }

这个的制造商应该给自己一个轻拍! 谢谢 Deasync 的创造者 :)

https://www.npmjs.com/package/deasync

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM